【问题标题】:Beautiful Soup 4 code returns different answer for different situationsBeautiful Soup 4 代码针对不同情况返回不同的答案
【发布时间】:2014-07-16 04:31:19
【问题描述】:

我正在尝试使用以下 BS4 代码抓取网页:

url = "http://www.xyz.con/abc.html"
#url2 = "file:///C:/Users/abc.html"
response = urllib2.urlopen(url)
html = response.read()
soup = BeautifulSoup(html)
myuls = soup.findAll("ul",{ "class" : "ctlg-holder"})
mya = myuls[0].findAll("a")

问题是,以下代码在在线页面上返回253个链接,但是当我将页面保存在我的计算机中并使用本地url2时,它返回342个链接(正确)

为什么我的代码只适用于本地保存的页面 (url2)?为什么它没有在 http url 上返回正确的答案?

【问题讨论】:

  • 页面可以在浏览器中使用javascipt生成额外的数据。
  • @furas:有什么解决方法吗?我真的不在乎 JS 部分。

标签: python-2.7 web-scraping beautifulsoup


【解决方案1】:

页面可以在浏览器中使用 javascipt 来生成额外的数据。

您无法使用 urllib2requests 获取数据,因为此工具不运行 javascript。

您可以使用Selenium 之类的工具来模拟浏览器并可以运行javascipt。

或者您必须在浏览器中分析页面并了解 javascript 如何获取额外数据。
也许您可以使用urllib2requests 下载它。但是额外的数据可以发送为JSON,你必须使用模块json

【讨论】:

  • 那为什么离线页面会返回正确答案?
  • 也许你用来保存页面的工具可以将DOM树的当前状态保存在它的内存中。你是用浏览器保存的吗?
  • 可能还有其他原因,浏览器可以为“登录”用户、浏览器内存中具有特殊cookie的用户、使用某种浏览器的用户等发送不同的页面。
  • 我正在抓取的网站不需要用户登录。
  • 在网页抓取问题中,最有用的信息是 url。没有 url,我们无法看到页面是如何工作的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-29
  • 1970-01-01
  • 2015-05-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多