【问题标题】:No Element in Xpath with lxml : Javascript Generated Page带有 lxml 的 Xpath 中没有元素:Javascript 生成的页面
【发布时间】:2018-10-19 17:11:25
【问题描述】:

我之前在其他东西上使用过 Xpath,在 Chrome 浏览器中,我可以使用 $x('//*[@id="profile"]/div[2]/div[2 在控制台中找到我的 xpath ]/div[1]/div[2]/div[2]/div[1]/span[2]) 在https://pubgtracker.com/profile/pc/Fuzzyllama/duo?region=na。

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

@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) 给我 []

【问题讨论】:

    标签: javascript python-3.x lxml


    【解决方案1】:

    所以,我尝试用 PyQt4 来做这件事,但在实践中并没有真正成功,一个更简单但更具侵入性的解决方案是使用 Selenium,一个用于加载网页的网络驱动程序。

    我确信有多种解决方案可以解决这个问题,但我有一个地狱般的时间,甚至在找到我的解决方案之前我都知道出了什么问题。

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

    如果什么都没有,则页面是用Javascript生成的内容。

    下面是一个简单的解决方案,这会等待页面渲染,然后让你用lxml解析树。

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

    from selenium import webdriver
    

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

    #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()
    

    我最初的解决方案本来不错,但由于其中大部分已被弃用,因此无法正常工作。

    【讨论】:

    • 这肯定是这个问题的有效解决方案,我不能标记它 2 天。
    【解决方案2】:

    您使用什么库作为解析器?

    如果xml.etree.ElementTree,

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

    http://effbot.org/zone/element-xpath.htm

    【讨论】:

    • 我使用的是完整的 etree 库,我能够从静态页面获取数据的 xpath,动态生成的页面是一个排他性问题。编辑:lxml 只是没有等待 JS 先加载,PyQt4 解决了这个问题。也可以用 Selenium 完成,只是我觉得有点臃肿。
    【解决方案3】:

    打开页面源代码view-source:https://pubgtracker.com/profile/pc/Fuzzyllama/duo?region=na 这里是 脚本,在 491 行带有 json playerData。只需解析它。

    【讨论】:

    • 您可以这样做,但您看过这些数据吗?绝对不是我想尝试解析的东西。这些键无济于事,因为它们通过成百上千行代码在元素之间重复使用。我将不得不以某种方式计算我想要的值的索引。编辑:这也没有得到 xpath 中的元素。
    • 对于任何想看看这个索引如何工作的人,我不会发布源代码,因为它太长了。索引为: playerData.Stats[0].Stats[9].ValueDec;我必须手动漂亮地打印数据以找出索引,这可能会很长。
    猜你喜欢
    • 2016-02-11
    • 1970-01-01
    • 2017-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-18
    • 2020-08-20
    • 2016-03-25
    相关资源
    最近更新 更多