如何设置BeautifulSoup以避免错误结果?

2024-04-18 23:28:02 发布

您现在位置:Python中文网/ 问答频道 /正文

在使用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")

我已经测试了几十个页面的URL,这些页面确实有这样的id,令我沮丧的是,得到的结果似乎是随机的。有时,一些网址会产生一个搜索命中率和其他时间没有。你知道吗

与此形成鲜明对比的是,如果我运行一个简单的字符串搜索,每次都会得到正确的结果:

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。令人震惊的是,我可以在同一组URL上连续运行两次BeautifulSoup代码,得到不同的响应。简单字符串搜索代码的结果是100%一致和准确的。你知道吗

有没有一个技巧来设置BeautifulSoup,以确保它像一个简单的字符串搜索一样一致和可靠?你知道吗

如果没有,是否有可靠且可重复的替代库?你知道吗


Tags: 字符串信息idobjurlclosereadhtml
1条回答
网友
1楼 · 发布于 2024-04-18 23:28:02

如今,页面加载变得越来越复杂,常常涉及一系列异步调用、大量客户端javascript逻辑、DOM操作等。您在浏览器中看到的页面通常不是通过requestsurllib2获得的页面。此外,网站可以有防御机制工作,例如,它可以检查User-Agent头,在多次连续请求后禁止您的IP等。这是真正的网站特定的,这里没有“银弹”。你知道吗

此外,BeautifulSoup解析页面的方式取决于the underlying parser。参见:Differences between parsers。你知道吗

实现“你在浏览器中看到的就是你在代码中得到的”的最可靠的方法是使用真正的浏览器,不管是无头的还是无头的。例如,^{}包在这里很有用。你知道吗

相关问题 更多 >