比较容器标签的“类”

时间:2019-10-16 05:11:38

标签: beautifulsoup

假设我从一些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")的操作仅适用于后代,不适用于容器标记。

2 个答案:

答案 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)