在Python中解析HTML—有些页面可以工作,有些页面不';T

在Python中解析HTML—有些页面可以工作,有些页面不';T,python,parsing,xpath,python-requests,lxml,Python,Parsing,Xpath,Python Requests,Lxml,使用以下脚本: 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

使用以下脚本:

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)

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

我在这个网站上尝试了很多页面,90%的页面都能正确使用这个脚本。但另外10%的人失败了,给出了随机数……有些人的情况大不相同,比如68而不是30。或者1100而不是30。有些更接近,比如12而不是9。我不知道发生了什么事


有人知道问题出在哪里吗?

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

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

如果您打开browser developer tools中的“网络”选项卡,您可能会看到加载的
store.js
javascript文件。在脚本的开头,您可以看到:

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

它的意思是,如果数量大于30,则“手动”将其设置为30。

对于失败的页面,您的xpath表达式似乎完全错误。首先要做的是花一些时间检查这些页面的内容,看看它与正常工作的页面有什么不同。@larsks我并不怀疑这一点。如果打开页面,您会注意到在正确的
数量:30出现之前,
数量:68“闪烁”。有趣的问题要解决,顺便说一句,史诗棋盘游戏。我喜欢。哦,哇……那很有趣。它只是不能解释数量9显示为12的情况。我会尽量仔细看的…谢谢。编辑:虽然,现在我不记得是哪一个有这个问题,我想知道我是不是看错了行或者什么,而那是人为错误。。。
if(stock>30) { $('div.availability span').text( "30" ); }
var instock = $('div.availability').text();
instock = instock.replace("In-Stock", "Quantity");