在Beautifoul汤中执行findAll()时跳过特定元素的内容

时间:2016-05-27 14:20:03

标签: python python-3.x beautifulsoup html-parsing

例如:我想找到带有类"作者"(soup.findall(class_='author'))的元素的内容,但跳过使用类"注释"(({{1} }})。

所以上课"作者"但不在任何带有类"注释"

的元素中

是否可以在bs中执行此类操作?

示例html:

soup.findall(class_='comments')

2 个答案:

答案 0 :(得分: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")

答案 1 :(得分:-1)

我认为一种方法是使用for循环和if语句来使用.parent进行过滤。这可以根据您的需要进行清理,但它可以使用item.parent ['class']来获取包含divs类进行比较。

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']]