如何查找具有特定类名但不包含其他类别的li
代码?例如:
...
<li> no wanted </li>
<li class="a"> not his one </li>
<li class="a z"> neither this one </li>
<li class="b z"> neither this one </li>
<li class="c z"> neither this one </li>
...
<li class="z"> I WANT THIS ONLY ONE</li>
...
代码:
bs4.find_all ('li', class_='z')
返回多个条目,其中有"z"
和另一个类名。
如何单独找到类名为"z"
的条目?
答案 0 :(得分:2)
您可以使用CSS selectors来匹配确切的类名。
html = '''<li> no wanted </li>
<li class="a"> not his one </li>
<li class="a z"> neither this one </li>
<li class="b z"> neither this one </li>
<li class="c z"> neither this one </li>
<li class="z"> I WANT THIS ONLY ONE</li>'''
soup = BeautifulSoup(html, 'lxml')
tags = soup.select('li[class="z"]')
print(tags)
使用lambda
:
tags = soup.find_all(lambda tag: tag.name == 'li' and tag.get('class') == ['z'])
输出:
[<li class="z"> I WANT THIS ONLY ONE</li>]
看看Multi-valued attributes。您会理解为什么class_='z'
会匹配其类名中包含z
的所有代码。
HTML 4定义了一些可以包含多个值的属性。 HTML 5删除了其中的几个,但定义了一些。最常见的多值属性是
class
(也就是说,标记可以有多个CSS类)。其他人包括rel
,rev
,accept-charset
,headers
和accesskey
。 Beautiful Soup将多值属性的值显示为列表:css_soup = BeautifulSoup('<p class="body"></p>') css_soup.p['class'] # ["body"] css_soup = BeautifulSoup('<p class="body strikeout"></p>') css_soup.p['class'] # ["body", "strikeout"]
答案 1 :(得分:1)
您可以轻松地做到:
data = soup.find_all('li',{'class':'z'})
print(data)
如果您只想获取文本:
for a in data:
print(a.text)
答案 2 :(得分:0)
可能使用doc
中的过滤功能def is_only_z(css_class):
return css_class is not None and css_class == 'z'
bs4.find_all('li',class_=is_only_z)