Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用lxml:Javascript生成的页面在Xpath中没有元素_Javascript_Python 3.x_Lxml - Fatal编程技术网

使用lxml:Javascript生成的页面在Xpath中没有元素

使用lxml:Javascript生成的页面在Xpath中没有元素,javascript,python-3.x,lxml,Javascript,Python 3.x,Lxml,我以前使用过Xpath,在Chrome浏览器中,我可以在控制台中用$x('/*[@id=“profile”]/div[2]/div[2]/div[1]/div[2]/div[2]/div[1]/span[2])找到我的Xpath 当我试图在代码中获取这个元素时,它返回一个空数组,有人知道为什么吗 @client.command(pass_context=True) async def checkChrisPubg(ctx): page = requests.get('https://pu

我以前使用过Xpath,在Chrome浏览器中,我可以在控制台中用$x('/*[@id=“profile”]/div[2]/div[2]/div[1]/div[2]/div[2]/div[1]/span[2])找到我的Xpath

当我试图在代码中获取这个元素时,它返回一个空数组,有人知道为什么吗

@client.command(pass_context=True)
async def checkChrisPubg(ctx):
    page = requests.get('https://pubgtracker.com/profile/pc/Fuzzyllama/duo?region=na')
    tree = html.fromstring(page.content)
    duoRank = tree.xpath('//*[@id="profile"]/div[2]/div[2]/div[1]/div[2]')
    print(duoRank)

print(duoRank)给了我[]

您使用什么库作为解析器

如果
xml.etree.ElementTree

ElementTree对XPath表达式提供了有限的支持。目标是支持缩写语法的一小部分;完整的XPath引擎不在核心库的范围内


因此,我尝试用PyQt4实现这一点,但在实践中没有真正的成功,一种更简单但更具侵入性的解决方案是使用Selenium,一种用于加载网页的web驱动程序

我确信有多种解决方案,但在我找到解决方案之前,我一直在经历一段痛苦的时光,甚至知道什么是错的

使用lxml时,应确保试图获取的数据不是由javascript生成的。为此,您可以打开Chrome Developer tools单击菜单(3个垂直点),进入设置,进入底部,禁用Javascript,然后重新加载页面

如果没有内容,则页面将使用Javascript生成内容

下面是一个简单解决方案,它将等待页面呈现,然后让您使用lxml解析树

此解决方案将要求您使用这些导入(您必须安装selenium):

现在,您可以加载页面并开始抓取:

#Load in your browser(I use chrome)
browser = webdriver.Chrome()
#Choose url you want to scrape
url = 'https://pubgtracker.com/profile/pc/Fuzzyllama/duo?region=na'
#get the url with Selenium
browser.get(url)
#get the innerhtml from the rendered page
innerHTML = browser.execute_script("return document.body.innerHTML")

#Now use lxml to parse the page
tree = html.fromstring(innerHTML)
#Get your element with xpath
duoRank = tree.xpath('//*[@id="profile"]/div[2]/div[2]/div[1]/div[2]/div[2]/div[1]/span[2]/text()')
#close the browser
browser.quit()

我最初的解决方案本来是不错的,但由于很多内容已被弃用,所以没有起作用。

开放页面源代码
查看源代码:https://pubgtracker.com/profile/pc/Fuzzyllama/duo?region=na
这是脚本,第491行带有json
playerData
。只要解析它。

我使用的是完整的etree库,我能够从静态页面获取XPath数据,动态生成的页面是唯一的问题。编辑:lxml没有等待JS先加载,PyQt4解决了这个问题。硒也可以做,我觉得有点臃肿。这肯定是解决这个问题的有效方法,我两天内都不能做标记。你可以做,但是你看到数据了吗?绝对不是我想尝试分析的东西。这些键没有帮助,因为它们通过上百行/数千行代码在元素之间重复使用。我必须以某种方式计算我想要的值的索引。编辑:这也没有得到xpath中的元素。对于任何想看看这个索引如何工作的人,我不会发布源代码,因为它太长了。索引应该是:playerData.Stats[0].Stats[9].ValueDec;我不得不手工打印数据来计算索引,这可能会非常冗长。
#Load in your browser(I use chrome)
browser = webdriver.Chrome()
#Choose url you want to scrape
url = 'https://pubgtracker.com/profile/pc/Fuzzyllama/duo?region=na'
#get the url with Selenium
browser.get(url)
#get the innerhtml from the rendered page
innerHTML = browser.execute_script("return document.body.innerHTML")

#Now use lxml to parse the page
tree = html.fromstring(innerHTML)
#Get your element with xpath
duoRank = tree.xpath('//*[@id="profile"]/div[2]/div[2]/div[1]/div[2]/div[2]/div[1]/span[2]/text()')
#close the browser
browser.quit()