【问题标题】:Parsing HTML in Python - Some pages work and some don't...?在 Python 中解析 HTML - 有些页面可以工作,有些则不能......?
【发布时间】:2016-05-16 03:54:24
【问题描述】:

使用以下脚本:

from lxml import html
import requests

gameUrl = 'http://store.401games.ca/catalog/2415520/caylus'
page = requests.get(gameUrl)
tree = html.fromstring(page.content)

stock = tree.xpath('//*[@id="stock"]/span[1]/div/*/text()')[0]

print stock

它将正确显示页面上列出的库存水平。 (此时为 1 个)

gameUrl = 'http://store.401games.ca/catalog/2415324/ticket-to-ride'

它显示库存为 68,这是不正确的。 (我什至不知道 68 是从哪里来的)。

我在这个站点的很多页面上都试过这个,其中 90% 的页面使用这个脚本都能正常工作。但是另外 10% 失败并给出随机数……有些完全不同,比如 68 而不是 30。或者 1100 而不是 30。有些更接近,比如 12 而不是 9。我不知道发生了什么。

有人知道可能是什么问题吗?

【问题讨论】:

  • 听起来你的 xpath 表达式对于失败的页面来说是完全错误的。首先要做的是花一些时间检查这些页面的内容,看看它与正常工作的页面有何不同。
  • @larsks 这不是我怀疑的。如果您打开该页面,您会注意到quantity: 68 在正确的quantity: 30 出现之前“闪烁”。有趣的问题要解决,我会说。

标签: python parsing xpath python-requests lxml


【解决方案1】:

如果您在浏览器中打开该页面,您会看到Quantity: 68 在变为Quantity: 30 之前闪烁。

起初,我以为有一个 XHR 请求在页面加载后从某个端点动态获取产品可用性,几乎开始提供有关浏览器自动化的常见答案,但这里的问题不同。

如果您在浏览器开发人员工具中打开“网络”选项卡,您可能会看到正在加载的 store.js javascript 文件。在脚本的开头,你可以看到:

if(stock>30) { $('div.availability span').text( "30" ); }
var instock = $('div.availability').text();
instock = instock.replace("In-Stock", "Quantity");

意思是,如果数量超过30,则“手动”设置为30。

【讨论】:

  • 史诗棋盘游戏,顺便说一句。喜欢它。
  • 哦哇...这很有趣。它只是没有解释数量 9 显示为 12 的一种情况。我会尝试更仔细地查看...谢谢。编辑:虽然,现在我不记得哪一个有这个问题,我想知道我是否只是看错了行或其他东西,而那个是人为错误......
猜你喜欢
  • 1970-01-01
  • 2018-01-27
  • 2020-07-25
  • 2020-12-18
  • 1970-01-01
  • 2021-07-01
  • 2013-07-04
  • 2017-01-27
  • 1970-01-01
相关资源
最近更新 更多