2016-09-19 99 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。这是Python内置的HTML解析器的另一个常见问题,它有时会跳过它不理解的标签。再次,解决方案是安装lxml或html5lib。“ 所以我安装了html5lib。但我仍然有同样的行为。

谢谢您的帮助

+0

我实际上没有看到“招聘”链接此页面上 - 我们寻找到相同的页面.. – alecxe

+0

你会看到“职业生涯”的链接通过查看网站地图在这里HTTP:// WWW? .bestwestern.com.au/sitemap/ – BND

回答

0

的一个问题是 - 你正在使用BeautifulSoup版本3未维持了。您需要升级到BeautifulSoup version 4

pip install beautifulsoup4 

的另一个问题是,有没有“职业生涯”链接的主页上,但有一个“网站地图”页面上 - 请求,并使用默认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

我有BeautifulSoup的版本4,但仍无法找到链接。我不知道默认的解析器是否为Python的内置HTML解析器,但我认为问题可能来自于这一方。 – BND

+0

这是Python内置HTML解析器的另一个常见问题,它有时会跳过它不理解的标签。同样,解决方案是安装lxml或html5lib。“所以我安装了html5lib。但我仍然有同样的行为。 – BND

+0

@BND nono,正如我所问 - 主页上没有“careers”链接,但在“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)