Как find_all (id) из div с красивым супом в python - PullRequest
2 голосов
/ 03 июля 2019

Я хочу распечатать все идентификаторы со страницы, которая имеет уникальный класс.

Страница, которую я хочу очистить с помощью Beautiful Soup, выглядит следующим образом:

<div itemscope itemprop="item" itemtype="http://schema.org/Product" id="12345" class="realestate"> 
<div class="contentArea"> 
<meta itemprop="name" content="Name - 12345 " /> 
<meta itemprop="url" content="https://url12345.hu" />   
<meta itemprop="category" content="category1" />   
</div>
</div>
<div itemscope itemprop="item" itemtype="http://schema.org/Product" id="12346" class="realestate"> 
<div class="contentArea"> 
<meta itemprop="name" content="Name - 12346 " /> 
<meta itemprop="url" content="https://url12346.hu" />   
<meta itemprop="category" content="category1" />   
</div>
</div>

'ID' - это уникальный идентификатор из DIVs Itemscope, поэтому я как-то хочу извлечь эти уникальные идентификаторы и распечатать их все (резонно - прикрепить всю другую рекламную информацию к этому идентификатору (например, имя, URL, и т.д.) позже)

Я пытался с этим кодом Python, но он не работает.

import requests
from bs4 import BeautifulSoup

page = requests.get('searchResultPage.url')
soup = BeautifulSoup(page.text, 'html.parser')
id = soup.find_all('id')
print(id)

Возвращает пустой список.

То, что я ожидаю, и что я хочу, это получить список с идентификаторами из div, таким образом: 12345 12346

Спасибо за вашу помощь заранее!

Ответы [ 3 ]

2 голосов
/ 03 июля 2019

Существует разница между тегом и атрибутом, в вашем случае div является тегом, а id является атрибутом тега.Поэтому вы должны использовать find_all(name='tag'), чтобы найти все теги, а после вы можете использовать get('attribute'), чтобы получить атрибут.Если вы хотите отбирать длинные страницы, вы можете немного оптимизировать свой код, используя список понимания:

soup = BeautifulSoup(markup=page, 'html.parser')
test = [r['id'] for r in soup.find_all(name="div", attrs={"id":"12346"}) if r.get('id') is not None]

Вывод:

['12345', '12346']

Более того, вы можете использовать find_all(), чтобы получитьвсе теги, которые имеют атрибут id (спасибо Джон Клементс), например:

test = [r['id'] for r in soup.find_all(name="div", attrs={"id":True})]
2 голосов
/ 03 июля 2019

Функция find_all () BeautifulSoup находит все HTML-теги определенного вида.id это не тег, это атрибут тега.Вы должны искать теги, содержащие идентификаторы, которые вам нужны, в этом случае тег div.

div_tags = soup.find_all('div')
ids = []
for div in div_tags:
     ID = div.get('id')
     if ID is not None:
         ids.append(ID)

BeautifulSoup также предоставляет возможность поиска тегов с определенными атрибутами.

1 голос
/ 03 июля 2019

HS-туманность верна, что find_all ищет теги определенного типа, в вашем супе id это атрибут, а не тип тега.Чтобы получить список всех идентификаторов в супе, вы можете использовать следующий вкладыш

ids = [tag['id'] for tag in soup.select('div[id]')]

, который использует CSS-селекторы вместо bs4 find_all, так как я нахожу документы bs4 относительно его встроенных модулей.

Итак, что делает soup.select, это возвращает список всех элементов div, имеющих атрибут id, затем мы перебираем этот список тегов div и добавляем значение атрибута id в список идентификаторов.

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