Beautifulsoup筛选器包含一个类而不是另一个类

时间:2019-01-20 18:52:02

标签: python beautifulsoup

我想过滤包含“类”并且不包括“样式”的脚本,并且我不想使用set,因为它不会返回正确的答案。 这是脚本:

<p class="price hidden-xs" style="width:100%">-</p>

并且我使用以下代码:

milage = soup.find_all('p', {'class' : 'price hidden-xs'})

我该如何解决?

3 个答案:

答案 0 :(得分:1)

您可以简单地过滤掉具有style属性且具有条件列表理解的元素:

from bs4 import BeautifulSoup

markup = (
    '<p id="with_style" class="price hidden-xs" style="width:100%">-</p>'
    '<p id="without_style" class="price hidden-xs">-</p>'
)

soup = BeautifulSoup(markup, "html.parser")

print(
    [
        e
        for e in soup.find_all("p", {"class": "price hidden-xs"})
        if not e.has_attr("style")
    ]
)

结果:

[<p class="price hidden-xs" id="without_style">-</p>]

答案 1 :(得分:1)

您可以简单地做到:

milage = soup.find_all('p', {'class' : 'price hidden-xs', 'style' : False})

这应该为您提供所有带有p的{​​{1}}标签,而没有带有class = price hidden-xs attr的标签。

BS : The basic find method

答案 2 :(得分:1)

您可以使用fromstring并在xpath表达式中不指定样式属性

#import requests
from lxml.html import fromstring
# url = ''
# tree = html.fromstring( requests.get(url).content)
h = '''
 <p class="price hidden-xs" style="width:100%">Not me</p>
 <p class="price hidden-xs">Me</p>
'''
tree = fromstring(h)
items = [item.text for item in tree.xpath("//p[@class='price hidden-xs' and not(@style)]")]
print(items)