2016-05-27 9 views
1

例:クラス "author"(soup.findall(class_='author'))の要素のコンテンツを検索したいが、クラス "comments"(soup.findall(class_='comments'))の要素内をスキップする。BeautifoulスープのfindAll()をスキップする場合

だから、クラス「著者」ではなくクラスを持つすべての要素の中には、

がBSでこのような何かをすることが可能です「コメント」

サンプル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は['find_all'がフィルタとして関数argを取り込むことができます](https://www.crummy.com/software/BeautifulSoup/bs4/doc/#a-function)。私はBSに多くの経験はありませんが、これで遊ぶことができるかもしれません。 –

+0

私は歩道にいます。私は 'soup.findall(class _ = 'author')。findParents()'と "commentsタグ"をチェックする必要があります。しかし、今私はそれについて考えることができません。私は明日それを理解するでしょう。 –

+0

htmlのサンプルを追加 –

答えて

-1

私は、forループとif文を使って、.parentを使ってフィルタリングする方法があると思います。これは必要に応じてクリーンアップできますが、item.parent ['class']を使用して、比較のためにdivクラスを取得します。

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 

か理解など:

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

避けたい要素が直接の親ではない場合にうまくいくかどうかわかりません。 '

Mark(...)
'のような関数の引数 '.findParents()'と組み合わせたRナールのコメントからのフィルタとしての関数argはより良いアプローチであるようです –

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) 

またはバージョン "ケース・小文字を区別しないが含む":

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) 

私はそれは次のようになり、コード内の任意の提案/クリーンアップなどを歓迎します誰かがそれを再利用可能にする方法を見つけ出すなら、素晴らしいです。findAll(class_="test", not_under="junk")

関連する問題