在使用BeautifulSoup时,我发现许多情况下,所搜索的信息肯定在HTML输入中,但BeautifulSoup无法找到它。这是一个问题,因为有些情况下信息不存在,因此无法知道BeautifulSoup的搜索结果是否是失败的情况,或者信息的真实情况根本就不存在。
这是一个简单的例子:
url_obj = urllib2.urlopen(url)
html = url_obj.read()
url_obj.close()
parsed_html = BeautifulSoup(html)
html = parsed_html.find(id="SalesRank")
我已经使用了几十个网址来运行测试id
,令我沮丧的是,看似随意的结果。有时,某些URL会产生搜索命中,有时则不会产生搜索命中。
与此形成鲜明对比的是,如果我运行简单的字符串搜索,我每次都会得到正确的结果:
url_obj = urllib2.urlopen(url)
html = url_obj.read()
url_obj.close()
index = html.find("SalesRank")
# Slice off a chunk-o-html from there
# Then use regex to grab what we are after
每次都有效。之前的BeautifulSoup示例以看似随机的方式失败。相同的网址。令人担忧的是,我可以在同一组URL上连续两次运行BeautifulSoup代码并获得不同的响应。简单的字符串搜索代码在结果中100%一致且准确。
有没有设置BeautifulSoup的技巧,以确保它像简单的字符串搜索一样可靠?
如果没有,是否有一个可靠且可重复的替代库?
答案 0 :(得分:0)
如今,页面加载变得更加复杂,并且通常涉及一系列异步调用,大量客户端javascript逻辑,DOM操作等。您在浏览器中看到的页面通常不是您通过{{{ 1}}或requests
。此外,该网站可以使用防御机制,例如,它可以检查urllib2
标题,在多次连续请求后禁止您的IP等。这实际上是特定于网站的,并且没有“银弹” “这里。
此外,User-Agent
解析页面的方式取决于the underlying parser。请参阅:Differences between parsers。
实现“您在浏览器中看到的是您在代码中获得的内容”的最可靠方法是使用真正的浏览器,无论是否无头。例如,selenium
包在这里很有用。