【问题标题】:Python: xpath to extract datesPython:提取日期的 xpath
【发布时间】:2020-04-09 13:33:14
【问题描述】:

我想提取31-Dec-19的日期,但无法提取

IC = requests.get('https://www.reuters.com/companies/IMAX.P/financials/income-statement-annual')
IC = html.fromstring(IC.content)
columns = IC.xpath('//th/span/text()')
>>['Revenue', 'Total Revenue', 'Cost of Revenue, Total', 'Gross Profit', 'Selling/General/Admin. Expenses, Total', 'Research & Development', 'Unusual Expense (Income)'
, 'Total Operating Expense', 'Operating Income', 'Interest Inc.(Exp.),Net-Non-Op., Total', 'Other, Net', 'Net Income Before Taxes', 'Provision for Income Taxes', 'Ne
t Income After Taxes', 'Net Income Before Extra. Items', 'Total Extraordinary Items', 'Net Income', 'Income Available to Com Excl ExtraOrd', 'Income Available to Com
 Incl ExtraOrd', 'Diluted Net Income', 'Diluted Weighted Average Shares', 'Diluted EPS Excluding ExtraOrd Items', 'DPS - Common Stock Primary Issue', 'Diluted Normal
ized EPS', 'Interest Exp.(Inc.),Net-Operating, Total', 'Dilution Adjustment', 'Depreciation/Amortization']

请指教如何使用 XPath 提取日期?

【问题讨论】:

  • 这个页面因为使用了ajax,你可以尝试另一种方式来做到这一点。
  • @jizhihaoSAMA,你能告诉我怎么做吗?

标签: python xpath


【解决方案1】:

您可以只使用请求并以 JSON(python 字典)的形式获取数据。如果您查看网络,则该网站正在调用 API 以获取其数据。我会这样做:

import requests
httpx = requests.Session()

# URLS
URL_Financials = 'https://www.reuters.com/companies/api/getFetchCompanyFinancials/IMAX.P'


response = httpx.get(URL_Financials)

data = response.json()

print(data)

数据现在是一个字典,您可以像获取任何 python 字典一样获取值。

另请参阅以下网址:

URL_QUOTE = 'https://www.reuters.com/companies/api/getFetchCompanyQuote/IMAX.P'
URL_OUOTES = 'https://www.reuters.com/companies/api/getFetchQuotes/.DJI,.SPX,.IXIC,.GSPTSE,.FTSE,.GDAXI,.FCHI,.TRXFLDEXPU,.N225,.HSI,.BSESN,.NSEI,.SSEC,.XU100,.JALSH,.TRXFLDAFPU,.TRXFLDZAP'

将收入数据转换为 Pandas

# ...

from functools import reduce
import pandas as pd

X = data['market_data']['financial_statements']['income']['annual']

dfs = [pd.DataFrame(X[column]).rename(columns={'value':column}) for column in X.keys() if len(X[column])==6]

df = reduce(lambda x, y: pd.merge(x, y, on ='date'), dfs)

print(df)

【讨论】:

  • 好吧,如果他要爬Api,还需要把日期2019-12-31改成31-Dec-19
  • @Prayson W. Daniel,谢谢。我知道日期在里面但是可以改成池塘更容易查看数据吗?那里有很多不相关的数据
  • 是的。它似乎将被放置在一个列表中。当前值位于索引 0。我不熟悉这个网站,但您在前端看到的内容是由后端 API 填充的。要仅获取日期,data['financial_statements']['income']['annual']['Revenue'][0]['date']
  • @Prayson W. Daniel,它在字典里。但是,我无法调用日期data['financial_statements']['income']['annual']['Revenue'][0]['date'],因为它返回KeyError: u'financial_statements'
  • 对不起,和另一个key一样。 I 打印机数据键。 print(data.keys()),这显示了第一层密钥。所以正确的位置是data['market_data'] ['financial_statements']['income']['annual']['Revenue'][0]['date']
【解决方案2】:

好吧,在页面的源代码中。它没有日期。所以您无法直接获取日期。(也许您可以找到API并抓取它,但我没有找到它。 )

所以使用 selenium(你也可以在 selenium 中使用 xpath)是一种简单的方法:

from selenium import webdriver
driver = webdriver.Chrome()
driver.get(url="https://www.reuters.com/companies/IMAX.P/financials/income-statement-annual")
date = driver.find_element_by_xpath("/html/body/div/div/div[4]/div[1]/div/div/section/div[2]/div[3]/table/thead/tr/th[2]/time").text
date
> 31-Dec-19

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-25
    • 1970-01-01
    • 2015-09-14
    • 1970-01-01
    • 2020-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多