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

Страница, которую я хочу очистить с помощью 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)

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

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

Заранее спасибо за помощь!

2
Laszlo Toth 3 Июл 2019 в 00:21

3 ответа

Лучший ответ

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

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

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

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

1
R. Arctor 2 Июл 2019 в 21:55

Функция 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 также предоставляет возможность находить теги с определенными атрибутами.

2
HS-nebula 2 Июл 2019 в 21:37

Существует разница между тегом и атрибутом, в вашем случае 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
Cobra 3 Июл 2019 в 07:32