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

Mig*_*sas 5 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>
...
Run Code Online (Sandbox Code Playgroud)

编码:

bs4.find_all ('li', class_='z') 返回几个条目,其中有一个"z"和另一个类名。

如何"z"单独找到带有类名的条目?

Key*_*dar 8

您可以使用CSS 选择器来匹配确切的类名。

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)
Run Code Online (Sandbox Code Playgroud)

使用lambda以下方法可以获得相同的结果:

tags = soup.find_all(lambda tag: tag.name == 'li' and tag.get('class') == ['z'])
Run Code Online (Sandbox Code Playgroud)

输出:

[<li class="z"> I WANT THIS ONLY ONE</li>]
Run Code Online (Sandbox Code Playgroud)

看看多值属性。您将了解为什么要class_='z'匹配z其类名中的所有标签。

HTML 4 定义了一些可以有多个值的属性。HTML 5 删除了其中一些,但定义了更多。最常见的多值属性是class(即一个标签可以有多个 CSS 类)。其他的还包括relrevaccept-charsetheaders,和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"]
Run Code Online (Sandbox Code Playgroud)


bir*_*der 0

可能具有文档中的过滤功能

def is_only_z(css_class):
    return css_class is not None and css_class == 'z'

bs4.find_all('li',class_=is_only_z)
Run Code Online (Sandbox Code Playgroud)