【问题标题】:Blank List returned when using XPath with Morningstar Key Ratios将 XPath 与 Morningstar 键比率一起使用时返回的空白列表
【发布时间】:2017-09-16 19:00:31
【问题描述】:

我正在尝试使用 XPath 从晨星关键比率页面中提取任何给定股票的数据。我有在谷歌浏览器的 XPath Helper 工具栏插件中返回结果的完整路径,但是当我将它插入我的代码时,我得到一个空白列表返回。

如何获得我想要返回的结果?这甚至可能吗?我是否使用了错误的方法?

非常感谢任何帮助!

我想要返回的数据片段:

AMD 关键比率示例:

我的代码:

from urllib.request import urlopen
import os.path
import sys
from lxml import html
import requests

page = requests.get('http://financials.morningstar.com/ratios/r.html?t=AMD&region=USA&culture=en_US')
tree = html.fromstring(page.content)
rev = tree.xpath('/html/body/div[1]/div[3]/div[2]/div[1]/div[1]/div[1]/table/tbody/tr[2]/td[1]')
print(rev)

代码结果:

[]

XPath Helper 的期望结果:

谢谢, 不是欧拉

【问题讨论】:

    标签: python-3.x xpath web-scraping request


    【解决方案1】:

    这是分阶段下载大部分内容的页面之一。如果您在使用 requests 之后查找您想要的项目,您会发现它还没有,如下所示。

    >>> import requests
    >>> url = 'http://financials.morningstar.com/ratios/r.html?t=AMD&region=USA&culture=en_US'
    >>> page = requests.get(url).text
    >>> '5,858' in page
    False
    

    处理这些页面的一种策略是使用 selenium 库。在这里,selenium 启动 Chrome 浏览器的副本,加载该 url,然后使用 xpath 表达式定位感兴趣的 td 元素。最后,您想要的数字可用作该元素的 text 属性。

    >>> from selenium import webdriver
    >>> driver = webdriver.Chrome()
    >>> driver.get(url)
    >>> td = driver.find_element_by_xpath('.//th[@id="i0"]/td[1]')
    <selenium.webdriver.remote.webelement.WebElement (session="f436b07c27742abb36b262639245801f", element="0.12745670001529863-2")>
    >>> td.text
    '5,858'
    

    【讨论】:

    • 感谢您抽出宝贵时间以清晰简单的方式解释问题 Bill Bell。我非常感激。你知道我可以使用 requests.get 多久调用一次晨星吗?
    • 不客气。很遗憾我不能告诉你多久可以访问他们的服务器。事实上,这是我第一次看到他们的页面。祝你好运!
    【解决方案2】:

    由于该页面的内容是动态生成的,因此您可以按照 Bill Bell 已经展示的那样完成该过程,或者您可以获取页面源然后在其上应用 css 选择器以获得所需的值。这是 xpath 的替代方法:

    from lxml import html
    from selenium import webdriver
    
    driver = webdriver.Chrome()
    driver.get('http://financials.morningstar.com/ratios/r.html?t=AMD&region=USA&culture=en_US')
    tree = html.fromstring(driver.page_source)
    driver.quit()
    rev = tree.cssselect('td[headers^=Y0]')[0].text
    print(rev)
    

    结果:

    5,858
    

    【讨论】:

    • 感谢您抽出宝贵时间回复Shahin!您的回答被证明是成功的,我感谢您抽出时间来帮助我!您知道在网站上调用 driver.get 或在某个页面上调用 tree.cssselect 的频率吗?使用 driver.get 后,您可以从页面中提取多少内容有限制吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-11
    • 2021-12-20
    相关资源
    最近更新 更多