无法找到与BeautifulSoup的所有链接以从网站中提取链接(链接标识)



我使用这里发现的代码(使用python和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。但我还是有同样的行为。

谢谢你的帮助

好的,所以这是一个老问题,但我偶然发现它在我的搜索,它似乎应该是相对简单的完成。我确实从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)

一个问题是-您使用的BeautifulSoup版本3不再被维护。您需要升级到BeautifulSoup版本4:

pip install beautifulsoup4

另一个问题是主页上没有"careers"链接,但是在"sitemap"页面上有一个-请求它并使用默认的html.parser解析器进行解析-你会看到"careers"链接打印在其他页面中:

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'])

请注意我是如何将"has to have href"规则移动到soup过滤器的

相关内容

  • 没有找到相关文章

最新更新