我想过滤包含“类”并且不包括“样式”的脚本,并且我不想使用set,因为它不会返回正确的答案。 这是脚本:
<p class="price hidden-xs" style="width:100%">-</p>
并且我使用以下代码:
milage = soup.find_all('p', {'class' : 'price hidden-xs'})
我该如何解决?
答案 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的标签。
答案 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)