Beautiful Soup находит все значения для данного атрибута, не указывая тег - PullRequest
4 голосов
/ 10 мая 2019

Есть ли способ получить все значения определенного атрибута?

Пример:

<a title="title-in-a">
  <b title="title-in-b"> ... </b>
  <c title="title-in-c"> ... </c>
  <d name="i-dont-care"> ... </d>
</a>

Можно ли получить все заголовки, даже если они находятся в разных тегах?

Ожидаемый результат:

['title-in-a', 'title-in-b', 'title-in-c']

Чтобы получить все заголовки в <a>, я знаю, что могу сделать это:

for item in soup.find_all('a'):
    print item['title']

Но как это сделать для всех тегов, дажене зная тегов?

Ответы [ 4 ]

3 голосов
/ 10 мая 2019

Если в вашем коде нет ошибок (то есть теги <b> и <c> заключены в тег <a>), то:

for i in soup4.find_all(title=True):
  print(i)

выведет:

<a title="title-in-a">
<b title="title-in-b"> ... </b>
<c title="title-in-c"> ... </c>
...</a>
<b title="title-in-b"> ... </b>
<c title="title-in-c"> ... </c>

Если, с другой стороны, каждый тег закрывается отдельно, так что код:

<a title="title-in-a">...</a>
<b title="title-in-b"> ... </b>
<c title="title-in-c"> ... </c>

вывод:

<a title="title-in-a">...</a>
<b title="title-in-b"> ... </b>
<c title="title-in-c"> ... </c>
2 голосов
/ 10 мая 2019

Использовать селектор атрибута.

titles = [item['title'] for item in soup.select('[title]')]
1 голос
/ 10 мая 2019

Вот решение для вашего варианта использования. Существует один метод по умолчанию, называемый attrs, который получает все атрибуты как dict {'name': 'value'}

response = '''<a title="title-in-a">
  <b title="title-in-b"> ... </b>
  <c title="title-in-c"> ... </c>
  <d name="i-dont-care"> ... </d>
</a>'''
total_attributes = []
soup = BeautifulSoup(response,'lxml')
for tags in soup.find_all():
    attributes = tags.attrs
    #some filtering goes here 
    if attributes:
        required = list(attributes.values())
        total_attributes = total_attributes + required
print(total_attributes)

вы можете ожидать результат как, также вы можете сделать фильтрацию на выделенном месте.

['title-in-a', 'title-in-b', 'title-in-c', 'i-dont-care']
0 голосов
/ 10 мая 2019

Используйте функцию python lambda для поиска атрибута тега title

from bs4 import BeautifulSoup

data='''<a title="title-in-a">
  <b title="title-in-b"> ... </b>
  <c title="title-in-c"> ... </c>
</a>'''

soup=BeautifulSoup(data,'html.parser')

for item in soup.find_all(lambda tag:[tag.attrs=='title']):
  print(item['title'])

Вывод:

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