Как найти тег без определенного атрибута, используя beautifulsoup? - PullRequest
0 голосов
/ 12 января 2019

Я пытаюсь получить содержимое тегов 'p', которые не имеют определенного атрибута.

У меня есть некоторые теги с 'class' = 'cost', а некоторые теги с 'class' = 'cost' и 'itemprop' = 'price'

all_cars = soup.find_all('div', attrs={'class': 'listdata'})
...
...
tatal_cost= car.findChildren('p', attrs={'class': 'cost'})
cost= car.findChildren('p', attrs={'class': 'cost', 'itemprop':'price'})

Я пытаюсь найти теги p без атрибута itemprop, но не могу найти какое-либо решение.

Ответы [ 2 ]

0 голосов
/ 12 января 2019

Для этого достаточно встроенных фильтров атрибутов BeautifulSoup. Вы можете указать True в качестве значения для простой проверки наличия атрибута. None может использоваться для указания того, что атрибут не должен присутствовать. Аналогичным образом, значением может быть любое значение атрибута (например, «стоимость»).

from bs4 import BeautifulSoup
html="""
<p class="cost">paragraph 1</p>
<p class="cost">paragraph 2</p>
<p class="cost">paragraph 3</p>
<p class="cost" itemprop="1">paragraph 4</p>
<p class="somethingelse">paragraph 5</p>
"""
soup=BeautifulSoup(html,'html.parser')
print("---without 'itemprop' attribute")
print(soup.find_all('p',itemprop=None))
print("---with class = 'cost' and without 'itemprop' attribute----")
print(soup.find_all('p',attrs={'itemprop':None,"class":'cost'}))
#below is an alternative way to specify this
#print(soup.find_all('p',itemprop=None,class_='cost'))

выход

---without 'itemprop' attribute
[<p class="cost">paragraph 1</p>, <p class="cost">paragraph 2</p>, <p class="cost">paragraph 3</p>, <p class="somethingelse">paragraph 5</p>]
---with class = 'cost' and without 'itemprop' attribute----
[<p class="cost">paragraph 1</p>, <p class="cost">paragraph 2</p>, <p class="cost">paragraph 3</p>]
0 голосов
/ 12 января 2019

BeautifulSoup позволяет вам определить функцию и передать ее в find_all() метод:

def has_class_but_not_itemprop(tag):
    return tag.has_attr('class') and not tag.has_attr('itemprop')

# Pass this function into find_all() and you’ll pick up all the <p> 
# tags you're after:

soup.find_all(has_class_but_not_itemprop)
# [<p class="cost">...</p>,
#  <p class="cost">...</p>,
#  <p class="cost">...</p>]

Для получения дополнительной информации см. Документацию BeautifulSoup .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...