2016-05-27 9 views
1

Beispiel: Ich möchte Inhalte des Elements mit der Klasse "Autor" finden (soup.findall(class_='author')) aber überspringen Suche in Elementen mit Klasse "Kommentare" ((soup.findall(class_='comments')).Überspringe den Inhalt eines bestimmten Elements, wenn findAll() in Beautiful Suppe

So Klasse "Autor", aber nicht in einem anderen Element mit Klasse "kommentiert"

Ist es möglich, so etwas wie dies in bs zu tun

Beispiel html:

<div class ='article'> 
    <span class='author'> John doe</span> <h3>title</h3> 
    (...) 
    <div class='comments'> 
     <div class='row'> 
      <span class='author'>Whining anon</span> 
      <div class='content'> 
      (...) 
      </div> 
     </div> 
    </div> 
</div> 
+1

BS erlaubt ['find_all', eine Funktion arg als Filter aufzunehmen] (https://www.crummy.com/software/BeautifulSoup/bs4/doc/#a-function). Ich habe nicht viel Erfahrung mit BS, aber Sie könnten vielleicht damit spielen. –

+0

Ich bin auf der Spur. Ich brauche 'sup.findall (class _ = 'author'). FindParents()' und überprüfe sie auf "comments tag". Aber jetzt bin ich nicht in Form, darüber nachzudenken. Ich werde es morgen herausfinden, wenn bis dahin niemand kommt. –

+0

Fügen Sie ein Beispiel für die html –

Antwort

-1

Ich denke, ein Weg wäre die Verwendung einer for-Schleife und if-Anweisung zum Filtern mit .parent. Dies kann für Ihre Bedürfnisse bereinigt werden, aber es funktioniert mit item.parent ['class'], um die enthaltene divs-Klasse zum Vergleich zu erhalten.

from bs4 import BeautifulSoup 

soup = BeautifulSoup(someHTML, 'html.parser') 

results = soup.findAll(class_="author") 

for item in results: 
    if 'comments' in item.parent['class']: 
     pass 
    else: 
     print item 

Oder als Verständnis:

clean_results = [item for item in results if 'comments' not in item.parent['class']] 
+0

Ich bin mir nicht sicher, ob es funktioniert, wenn Element, das ich vermeiden möchte, nicht ein unmittelbarer Elternteil ist. wie in '

Mark(...)
' Funktion arg als Filter von R Nar Kommentar kombiniert mit '.findParents()' scheint ein besserer Ansatz zu sein –

0
def AuthorNotInComments(tag): 
    c = tag.get('class') 
    if not c: 
     return False 
    if 'author' in c: 
     if tag.findParents(class_='comments'): 
      return False 
     return True 

soup.findAll(AuthorNotInComments) 

oder "Groß- und Kleinschreibung enthält" Version:

def AuthorNotInComments(tag): 
    c=tag.get('class') 
    if not c: 
     return False 
    p=re.compile('author', re.IGNORECASE) 
    str = " ".join(c) 
    if p.match(str) and not tag.findParents(class_=re.compile('comments'), 
    re.IGNORECASE): 
     return True 
    return False 

soup.findAll(AuthorNotInComments) 

Ich begrüße alle Vorschläge/Bereinigungen in Code usw. Es wäre toll, wenn jemand herausfinden würde, wie man es wiederverwendbar macht - so etwas wie findAll(class_="test", not_under="junk")