Как получить имя тегов с помощью BeautifulSoup в Python - PullRequest
0 голосов
/ 18 июня 2020

У меня есть пример кода html следующего содержания:

<tr class="searchResultsItem" data-id="455">
<td class="searchResultsImage">
<a href="/pets/2-months-english-bulldog-puppy" title="English BullDog">
....
..
..
<tr class="searchResultsItem" data-id="456">
<td class="searchResultsImage">
<a href="/pets/3-months-french-bulldog-puppy" title="French BullDog">
....
..
..

Код HTML продолжается, и мне удалось получить содержимое между тегами; но мне нужны названия / имена тегов. Чтобы быть точным c, мне нужно составить список, который продолжается как 455, 456 и c. Я искал stackoverflow, чтобы найти примеры ниже:

soup.body.find('tr')['data-id']

Они не работают.

Ответы [ 2 ]

0 голосов
/ 19 июня 2020

Вы не описали, что означает "don't work".

Может быть, у вас есть другой <tr> без data-id и используя только find('tr'), вы получите этот элемент, и когда вы попытаетесь получить ['data-id'], он не сможет его найти.

Но вы можете использовать find('tr', {'data-id': True}) или find_all('tr', {'data-id': True}), чтобы получить только элементы, которые имеют data-id

В примере я добавил <tr> без data-id в качестве первого элемента, чтобы показать, что это может привести к ошибке.

text = '''
<tr></tr>
<tr data-id="455"></tr>
<tr data-id="456"></tr>
'''

from bs4 import BeautifulSoup
soup = BeautifulSoup(text, 'html.parser')

#for tr in soup.find_all('tr', {'data-id': True}):
#    print(tr['data-id'])

print("--- with {'data-id': True} ---")
print('html   :', soup.find('tr', {'data-id': True}))
print('data-id:', soup.find('tr', {'data-id': True})['data-id'])

print("--- without {'data-id': True} ---")
print('html   :', soup.find('tr'))
print('data-id:', soup.find('tr')['data-id'])

Результат:

--- with {'data-id': True} ---
html   : <tr data-id="455"></tr>
data-id: 455
--- without {'data-id': True} ---
html   : <tr></tr>
Traceback (most recent call last):
...
KeyError: 'data-id'  
0 голосов
/ 19 июня 2020

Вы можете выбрать все <tr> с атрибутом data-id=, а затем искать <a> внутри строк.

Например:

txt = '''
<tr class="searchResultsItem" data-id="455">
<td class="searchResultsImage">
<a href="/pets/2-months-english-bulldog-puppy" title="English BullDog">
</td>
</tr>

<tr class="searchResultsItem" data-id="456">
<td class="searchResultsImage">
<a href="/pets/3-months-french-bulldog-puppy" title="French BullDog">
</td>
</tr>'''

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

for tr in soup.select('tr[data-id]'):
    print(tr['data-id'], tr.find('a')['title'])

Выводит:

455 English BullDog
456 French BullDog
...