使用带有Morningstar Key Ratios的XPath时返回空白列表

时间:2017-09-16 19:00:32

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

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

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

非常感谢任何帮助!

我想要的数据返回:

AMD主要比率示例:

AMD Key Ratios Example

我的代码:

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的期望结果:

XPath Result

谢谢, 不是Euler

2 个答案:

答案 0 :(得分:0)

这是分阶段下载大部分内容的页面之一。如果您在使用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'

答案 1 :(得分:0)

由于该页面的内容是动态生成的,因此您可以像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