2016-11-30 4 views
0

ich eine HTML-Seite wie diese:Python/BeautifoulSoup - Auszug div Inhaltskontrolle h1 Text

<div class="class1"> 
    <div class="head"> 
     <h1 class="title">Title 1</h1> 
    <div class="body"> 
<!-- some body content --> 
    </div> 
    </div> 
</div> 

<div class="class1"> 
    <div class="head"> 
     <h1 class="title">Title 2</h1> 
    <div class="body"> 
<!-- some body content --> 
    </div> 
    </div> 
</div> 

Ich brauche Inhalte aus den div mit class body nur zu extrahieren, wenn der Titel auf „Title 2“ gleich ist. Da ihre übergeordneten Container keine spezifischen IDs oder Klassen haben, ist der h1 Text die einzige Möglichkeit zu erkennen, worum es bei all dem Div geht. Im Moment benutze ich diesen Code:

from bs4 import BeautifoulSoup 

# code to open the webpage 
soup = BeautifulSoup(data, 'lxml') 
body_content = soup.findAll('div', {'class':'class1'})[1] 

Aber das ist nicht sehr elegant, da vermutet, dass die div ich interessiert bin, ist immer der zweite der Seite - es überprüft nicht für die Titel.

Antwort

1

Nun, die einzige Lösung, die ich denken kann, wie unten:

soup = BeautifulSoup(html,"html.parser") 
    result_tags = soup.find_all(name='div',class_='class1') 
    body_content = [tag for tag in result_tags if 'Title 2' in tag.prettify()][0] 

Es ist besser als Ihre ursprünglichen Codes, da es nicht Ihr Ziel div die zweite ist eine der Seite übernimmt.

0
html = '''<div class="class1"> 
    <div class="head"> 
     <h1 class="title">Title 1</h1> 
    <div class="body"> 
<!-- some body content --> 
    </div> 
    </div> 
</div> 

<div class="class1"> 
    <div class="head"> 
     <h1 class="title">Title 2</h1> 
    <div class="body"> 
<!-- some body content --> 
    </div> 
    </div> 
</div>''' 

from bs4 import BeautifulSoup 
soup = BeautifulSoup(html, 'lxml') 
soup.find(lambda tag: tag.get('class')==['class1'] and 'Title 2' in tag.text) 

oder:

def T2_tag(tag): 
    return tag.get('class')==['class1'] and 'Title 2' in tag.text 
soup.find(T2_tag)