我使用这里发现的代码(使用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过滤器的