任何人都可以帮我修改这个Python程序,以便正确地将信息提交到"日期范围"查询,然后提取"关闭"返回数据。我正在从以下网址抓取数据:
http://finance.yahoo.com/q/hp?s=%5EGSPC+Historical+Prices
这是我当前的代码,它返回" []"。
from lxml import html
import requests
def historic_quotes(symbol, stMonth, stDate, stYear, enMonth, enDate, enYear):
url = 'https://finance.yahoo.com/q/hp?s=%s+Historical+Prices' % (symbol)
form_data = {
'a': stMonth, #00 is January, 01 is Feb., etc.
'b': stDate,
'c': stYear,
'd': enMonth, #00 is January, 01 is Feb., etc.
'e': enDate,
'f': enYear,
'submit': 'submit',
}
response = requests.post(url, data=form_data)
tree = html.document_fromstring(response.content)
p = tree.xpath('//*[@id="yfncsumtab"]/tbody/tr[2]/td[1]/table[4]/tbody/tr/td/table/tbody/tr[2]/td[7]/text()')
print p
historic_quotes('baba',00,11,2010,00,11,2012)
我是一个整体的Python新手,非常感谢任何和所有的帮助。谢谢你的阅读!
另外,我现在意识到html源代码可能有所帮助,但它很大 - 所以这里有一个XPATH:
//*[@id="daterange"]/table
预期输出是"关闭"的列表来自不同日期的值。如前所述,当前的输出只是" []"。我相信form_data中的某些内容可能不正确,也许是"提交"。
答案 0 :(得分:2)
主要问题是您需要发出GET
个请求,而不是POST
。
另外,@ Paul Lo对日期范围是正确的。例如,我在2010年至2015年期间查询。
此外,您必须将查询参数作为字符串传递。 00
评估为0
,requests
将int 0转换为"0"
字符串。因此,您将00
作为参数值发送,而不是0
一个月。
这是一个固定版本,其中包含修改后的部分:
from lxml import html
import requests
def historic_quotes(symbol, stMonth, stDate, stYear, enMonth, enDate, enYear):
url = 'https://finance.yahoo.com/q/hp?s=%s+Historical+Prices' % symbol
params = {
'a': stMonth,
'b': stDate,
'c': stYear,
'd': enMonth,
'e': enDate,
'f': enYear,
'submit': 'submit',
}
response = requests.get(url, params=params)
tree = html.document_fromstring(response.content)
for amount in tree.xpath('//table[@class="yfnc_datamodoutline1"]//tr[td[@class="yfnc_tabledata1"]]//td[5]/text()'):
print amount
historic_quotes('baba', '00', '11', '2010', '00', '11', '2015')
打印:
105.95
105.95
105.52
108.77
110.65
109.25
109.02
105.77
104.70
105.11
104.97
103.88
107.48
105.07
107.90
...
90.57
答案 1 :(得分:1)
我怀疑阿里巴巴(BABA)在2010/1/11至2012/1/11期间有最新数据。
您可能需要首先检查response.content
中的原始数据,然后尝试更改范围:historic_quotes('baba',00,11,2014,00,11,2015)