假设我从一些HTML中提取了一些类:
p_standards = soup.find_all("p",attrs={'class':re.compile(r"Standard|P3")})
for p_standard in p_standards:
print(p_standard)
输出看起来像这样:
<p class="P3">a</p>
<p class="Standard">b</p>
<p class="P3">c</p>
<p class="Standard">d</p>
假设我只想在P3 classes
内打印文本,以使输出看起来像:
a
c
我认为下面的代码可以工作,但是没有。如何将容器标签的class
名称与某个值进行比较?
p_standards = soup.find_all("p",attrs={'class':re.compile(r"Standard|P3")})
for p_standard in p_standards:
if p_standard.get("class") == "P3":
print(p_standard.get_text())
我知道在第一行中,我可以简单地完成r"P3"
而不是r"Standard|P3"
,但这只是实际代码的一小部分(不是全部),并且我需要保留第一行。
注意:做类似.find("p", class_ = "P3")
的操作仅适用于后代,不适用于容器标记。
答案 0 :(得分:0)
好的,所以在玩完代码后,事实证明
p_standard.get("class")[0] == "P3"
有效。 (我错过了[0]
)
因此此代码有效:
p_standards = soup.find_all("p",attrs={'class':re.compile(r"Standard|P3")})
for p_standard in p_standards:
if p_standard.get("class")[0] == "P3":
print(p_standard.get_text())
答案 1 :(得分:0)
我认为以下更有效。使用select和CSS或语法收集基于任何一个类的列表。
from bs4 import BeautifulSoup as bs
html = '''
<html>
<head></head>
<body>
<p class="P3">a</p>
<p class="Standard">b</p>
<p class="P3">c</p>
<p class="Standard">d</p>
</body>
</html>
'''
soup = bs(html, 'lxml')
p_standards = soup.select('.Standard,.P3')
for p_standard in p_standards:
if 'P3' in p_standard['class']:
print(item.text)