BeautifulSoup - 如何单独查找特定的类名

时间:2018-03-05 19:39:44

标签: python beautifulsoup

如何查找具有特定类名但不包含其他类别的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"的条目?

3 个答案:

答案 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类)。其他人包括relrevaccept-charsetheadersaccesskey。 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)