2017-10-26 1 views
0

Ich versuche, einen Text innerhalb eines Site-Quellcodes mit BeautifulSoup zu scrappen. Teil den Quellcode sieht wie folgt aus:BeautifulSoup verwenden, um Text innerhalb eines Tags zu extrahieren

 <hr /> 
     <div class="see-more inline canwrap" itemprop="genre"> 
      <h4 class="inline">Genres:</h4> 
<a href="/genre/Horror?ref_=tt_stry_gnr" 
> Horror</a>&nbsp;<span>|</span> 
<a href="/genre/Mystery?ref_=tt_stry_gnr" 
> Mystery</a>&nbsp;<span>|</span> 
<a href="/genre/Thriller?ref_=tt_stry_gnr" 
> Thriller</a> 
     </div>  

So habe ich versucht, die Texte ‚Horror‘ ‚Geheimnis‘ und ‚Thriller‘ mit diesen Codes zu extrahieren:

import requests 
from bs4 import BeautifulSoup 
url1='http://www.imdb.com/title/tt5308322/?ref_=inth_ov_tt' 
r1=requests.get(url1) 
soup1= BeautifulSoup(r1.text, 'lxml') 
genre1=soup1.find('div',attrs={'itemprop':'genre'}).contents 
print(genre1) 

Aber die Rückkehr kommt als:

['\n', <h4 class="inline">Genres:</h4>, '\n', <a href="/genre/Horror? 
ref_=tt_stry_gnr"> Horror</a>, '\xa0', <span>|</span>, '\n', <a 
href="/genre/Mystery?ref_=tt_stry_gnr"> Mystery</a>, '\xa0', <span>|</span>, 
'\n', <a href="/genre/Thriller?ref_=tt_stry_gnr"> Thriller</a>, '\n'] 

ich bin ziemlich neu in python und Screen Scraping, also würde ich schätze all die Hilfe, die ich bekommen kann. Vielen Dank!

Antwort

1

versuchen diese, ich bin mit html.parser .let uns, wenn irgendwelche Schwierigkeiten stoßen

For data in genre1: 
    Geta = data.find_all("a") 
    Text = "" 
    For i in Geta: 
     Text = i.text 
     Print (text) 

Bitte den Einzug überprüfen, wie ich bin mit Handy

1

Verwenden straight-forward BeautifulSoup.select() Funktion der extrahieren benötigte Elemente CSS selector:

import requests 
from bs4 import BeautifulSoup 

url1 = 'http://www.imdb.com/title/tt5308322/?ref_=inth_ov_tt' 
soup = BeautifulSoup(requests.get(url1).text, 'lxml') 
genres = [a.text.strip() for a in soup.select("div[itemprop='genre'] > a")] 

print(genres) 

Der Ausgang:

['Horror', 'Mystery', 'Thriller'] 

https://www.crummy.com/software/BeautifulSoup/bs4/doc/#css-selectors

+1

Dies sollte die akzeptierte Antwort. Einfach schön. – deshu

+0

@deshu, danke ... – RomanPerekhrest

2

können Sie BeautifulSoup get_text() verwenden Methode indstead od die .contents Eigenschaft zu bekommen, was Sie wollen:


Von get_text() documentation:

Wenn Sie nur wollen der Textteil eines Dokuments oder Tags, können Sie die verwenden get_text() -Methode. Sie gibt die gesamten Text in einem Dokument oder unter einem Tag, als ein einzelner Unicode-String:

markup = '<a href="http://example.com/">\nI linked to <i>example.com</i>\n</a>' 
soup = BeautifulSoup(markup) 

soup.get_text() 
>>> u'\nI linked to example.com\n' 
soup.i.get_text() 
>>> u'example.com' 

Sie eine Zeichenfolge angeben können, um die Bits von Text miteinander verbinden verwendet werden:

soup.get_text("|") 
>>> u'\nI linked to |example.com|\n' 

können Sie schöne Suppe sagen Leerzeichen am Anfang und am Ende jedes Bit des Textes abzustreifen:

soup.get_text("|", strip=True) 
>>> u'I linked to|example.com' 

Aber an diesem Punkt müssen Sie möglicherweise die .stripped_strings verwenden möchten Generator statt und verarbeiten den Text selbst:

[text for text in soup.stripped_strings] 
>>> [u'I linked to', u'example.com'] 
0

Sie können auf verschiedene Weise das gleiche tun. Css-Selektoren sind präzise, ​​leicht zu verstehen und weniger fehleranfällig.So kann man mit Selektoren geht auch den Zweck zu dienen:

from bs4 import BeautifulSoup    
import requests 

link = 'http://www.imdb.com/title/tt5308322/?ref_=inth_ov_tt' 

res = requests.get(link).text 
soup = BeautifulSoup(res,'lxml') 
genre = ' '.join([item.text.strip() for item in soup.select(".canwrap a[href*='genre']")]) 
print(genre) 

Ergebnis:

Horror Mystery Thriller 
Verwandte Themen