2016-09-19 2 views
-1

Я использую этот код, найденный здесь (retrieve links from web page using python and BeautifulSoup), чтобы извлечь все ссылки с веб-сайта.Невозможно найти все ссылки с BeautifulSoup для извлечения ссылок с веб-сайта (идентификация ссылки)

import httplib2 
from BeautifulSoup import BeautifulSoup, SoupStrainer 

http = httplib2.Http() 
status, response = http.request('http://www.bestwestern.com.au') 

for link in BeautifulSoup(response, parseOnlyThese=SoupStrainer('a')): 
    if link.has_attr('href'): 
     print link['href'] 

Я использую этот сайт http://www.bestwestern.com.au как тест. К сожалению, я заметил, что код не извлекает некоторые ссылки, например, этот http://www.bestwestern.com.au/about-us/careers/. Я не знаю почему. В коде страницы это то, что я нашел.

<li><a href="http://www.bestwestern.com.au/about-us/careers/">Careers</a></li> 

Я думаю, что экстрактор должен обычно идентифицировать его. В документации BeautifulSoup я могу прочитать: «Наиболее распространенным типом неожиданного поведения является то, что вы не можете найти тег, который, как вы знаете, находится в документе. Вы видели, как это происходит, но find_all() возвращает [] или find() возвращает None. Это еще одна распространенная проблема с встроенным парсером HTML Python, который иногда пропускает теги, которые он не понимает. Опять же, решение заключается в установке lxml или html5lib. " Итак, я установил html5lib. Но у меня все еще такое же поведение.

Спасибо за вашу помощь

+0

Я на самом деле не вижу «Карьера» ссылка на эту страницу - мы ищем на той же странице .. – alecxe

+0

Вы увидите «карьеры» ссылка глядя карта сайта здесь HTTP: // WWW? .bestwestern.com.au/sitemap/ – BND

ответ

0

Одна проблема - вы используете BeautifulSoup версии 3, которая не поддерживается больше. Вам необходимо обновить до BeautifulSoup version 4:

pip install beautifulsoup4 

Другая проблема заключается в том, что нет «карьеры» ссылка на главной странице, но есть одна на странице «Sitemap» - запросить его и разобрать с присвоенным html.parser парсер - вы увидите «карьеры» ссылку печататься среди других:

import requests 
from bs4 import BeautifulSoup, SoupStrainer 

response = requests.get('http://www.bestwestern.com.au/sitemap/') 

for link in BeautifulSoup(response.content, "html.parser", parse_only=SoupStrainer('a', href=True)): 
    print(link['href']) 

Обратите внимание, как я переехал «должно иметь HREF» правило для супа сита.

+0

У меня есть версия 4 BeautifulSoup, но я не могу найти ссылку. Я не знаю, был ли синтаксический анализатор по умолчанию встроенным анализатором HTML Python, но я думаю, что проблема может возникнуть с этой стороны. – BND

+0

Это еще одна распространенная проблема с встроенным парсером HTML Python, который иногда пропускает теги, которые он не понимает. Опять же, решение заключается в установке lxml или html5lib. "Поэтому я установил html5lib. Но у меня все еще такое же поведение. – BND

+0

@BND nono, как я уже спросил - на главной странице нет ссылки «карьеры», но есть одна на странице «sitemap» - обновлен код в ответе - работает для меня как есть и печатает " carrers ". – alecxe

1

Хорошо, так что это старый вопрос, но я наткнулся на него в моем поиске, и кажется, что это должно быть относительно просто выполнить. Я переключился с httplib2 на запросы.

import requests 
from bs4 import BeautifulSoup, SoupStrainer 
baseurl = 'http://www.bestwestern.com.au' 

SEEN_URLS = [] 
def get_links(url): 
    response = requests.get(url) 
    for link in BeautifulSoup(response.content, 'html.parser', parse_only=SoupStrainer('a', href=True)): 
     print(link['href']) 
     SEEN_URLS.append(link['href']) 
     if baseurl in link['href'] and link['href'] not in SEEN_URLS: 
      get_links(link['href']) 

if __name__ == '__main__': 
    get_links(baseurl)