сравнить «класс» контейнера тега - PullRequest
1 голос
/ 16 октября 2019

Допустим, я извлекаю некоторые классы из некоторого 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 голосов
/ 16 октября 2019

Я думаю, что следующее более эффективно. Используйте синтаксис select и CSS Or, чтобы собрать список на основе любого класса.

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)
0 голосов
/ 16 октября 2019

ОК, так что после игры с кодом, получается, что

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())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...