Как определить, какие HTML-теги или классы указывать при извлечении из веб-страницы? - PullRequest
0 голосов
/ 23 мая 2018

Я хочу почистить новостные ссылки (выделены на скриншоте ниже) на веб-сайте:

enter image description here

Когда я inspect страница,Я вижу, что нужные мне ссылки содержатся в классе col-sm-5 под тегом h5.Я хочу очистить все 4 ссылки (с тегом li) в этом классе div, col-sm-5.Итак, я написал следующий код для извлечения ссылок:

import requests 
page = requests.get("http://www3.asiainsurancereview.com/News","html.parser")
soup = BeautifulSoup(page.text, "html.parser")
li_box = soup.find('h5', attrs={'class': 'col_sm_5'})
print(li_box) 

Но я получаю вывод none;он не может найти тег, я полагаю.Итак, мой вопрос: как мне указать класс, тег или другую информацию, необходимую для поиска и извлечения ссылок?

Ответы [ 3 ]

0 голосов
/ 23 мая 2018

Вы пытаетесь получить доступ к элементу, который не существует в HTML страницы.

li_box = soup.find('h5', attrs={'class': 'col_sm_5'})

в этой строке вы пытаетесь получить тег h5 с классом 'col_sm_5', который не существует в HTMLстраницы.В HTML есть только div с классом col-sm-5.

Now Solution.Самый простой способ сделать это - использовать select () из BeautifulSoup.

>>> page = requests.get("http://www3.asiainsurancereview.com/News","html.parser")
>>> soup = BeautifulSoup(page.content, "html.parser")
>>> aa = soup.select("div.col-sm-5 ul.list-default li h5 a")
>>> for a in aa:
...     print(a.attrs['href'])
...
/Mock-News-Article/id/42945/Type/eDaily/New-Zealand-Govt-starts-public-consultation-phase-of-review-of-insurance-law
/Mock-News-Article/id/42946/Type/eDaily/India-M-A-deals-brewing-in-insurance-sector
/Mock-News-Article/id/42947/Type/eDaily/China-Online-insurance-premiums-soar-31-in-1Q2018
/Mock-News-Article/id/42948/Type/eDaily/South-Korea-Courts-increasingly-see- 65-as-retirement-age
>>>

soup.select найдет все теги в пределах h5 в пределах li внутри div с классом col-sm-5

Затем переберите все элементы и получите требуемый атрибут, который в вашем случае является href.

0 голосов
/ 23 мая 2018

не существует класса для тега h5

Попробуйте это,

select_div = soup.findAll('div', {'class': 'col-sm-5'})
result = []
for each_div in select_div:
    links = each_div.findAll('a');
    for each_tag in links:
        link = each_tag.attrs['href']       
        result.append(str(link))

print(result)

Вывод будет список URL

['/ Mock-News-Article / id / 42945 / Type / eDaily / New-Zealand-Govt запускает-публичная-консультация-фаза пересмотра страхового права', '/ Mock-News-Article/ id / 42946 / Тип / eDaily / India-MA-сделки-пивоварения в страховом секторе ',' / Mock-News-Article / id / 42947 / Тип / eDaily / Китай-онлайн-страховые премии-взлет31-in-1Q2018 ',' / Mock-News-Article / id / 42948 / Type / eDaily / Южная Корея-Суды все чаще видят пенсионный возраст ']

0 голосов
/ 23 мая 2018

requests.get() не нужно "html.parser", что для BeautifulSoup.

Кроме того, имя класса col-sm-5 не col_sm_5.

Лучше использовать ответ content вместо text.(Возможно, это не так, см. Комментарии)

Вы можете использовать селектор css, как показано ниже:

import requests
from bs4 import BeautifulSoup

page = requests.get("http://www3.asiainsurancereview.com/News")
soup = BeautifulSoup(page.content, "html.parser")
li_box = soup.select('div.col-sm-5 > ul > li > h5 > a')
for link in li_box:
    print(link['href'])

Вывод:

/Mock-News-Article/id/42945/Type/eDaily/New-Zealand-Govt-starts-public-consultation-phase-of-review-of-insurance-law
/Mock-News-Article/id/42946/Type/eDaily/India-M-A-deals-brewing-in-insurance-sector
/Mock-News-Article/id/42947/Type/eDaily/China-Online-insurance-premiums-soar-31-in-1Q2018
/Mock-News-Article/id/42948/Type/eDaily/South-Korea-Courts-increasingly-see-65-as-retirement-age
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...