2016-02-21 120 views
0

我正在創建一個網絡刮取python代碼(使用2.7.11),它使用符號提取股票價格。我不知道爲什麼這不起作用。但它給了我這樣的輸出:網頁刮取代碼來提取股票價格

Enter Financial Symbol 

appl YPE h 
Do you want to run again? 

我的代碼如下:

import urllib 

go=True 

while go: 
    print "Enter Financial Symbol" 
    symbol=raw_input() 

    page=urllib.urlopen("http://finance.yahoo.com/q?s=" + symbol) 

    text=page.read() 
    where=text.find("yfs_l84") 

    start=where+7 
    end=start+5 

    result = text[start:end] 
    print (symbol + " "+ result) 


    print "Do you want to run again?" 
    choice=raw_input() 
    if choice == "no": 
     go=False 

我如何工作的呢?

回答

0

您正在搜索的字符串"yfs_l84"未包含在由yahoo返回的HTML中。所以

where=text.find("yfs_l84") 

where-1。所以,你的片text[start:end]永遠是text[6:11]YPR h出的頁面源:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> 
<html lang="en-US"> 
<head> 
    ... 
0

你不應該使用str.find解析網頁,你應該使用一個HTML解析器像bs4但在這種情況下,是一種可以從json格式請求數據的api,與requests結合使得獲取數據變得非常簡單。

In [25]: import requests 

In [26]: sym = "DVN"  
In [27]: r = requests.get("http://finance.yahoo.com/webservice/v1/symbols/{sym}/quote?format=json".format(sym=sym)) 
In [28]: r.json() 
Out[28]: 
{'list': {'meta': {'count': 1, 'start': 0, 'type': 'resource-list'}, 
    'resources': [{'resource': {'classname': 'Quote', 
    'fields': {'name': 'Devon Energy Corporation Common', 
     'price': '18.650000', 
     'symbol': 'DVN', 
     'ts': '1455915714', 
     'type': 'equity', 
     'utctime': '2016-02-19T21:01:54+0000', 
     'volume': '33916489'}}}]}} 

In [29]: sym = "YHOO" 
In [30]: r = requests.get("http://finance.yahoo.com/webservice/v1/symbols/{sym}/quote?format=json".format(sym=sym)) 
In [31]: r.json() 
Out[31]: 
{'list': {'meta': {'count': 1, 'start': 0, 'type': 'resource-list'}, 
    'resources': [{'resource': {'classname': 'Quote', 
    'fields': {'name': 'Yahoo! Inc.', 
     'price': '30.040001', 
     'symbol': 'YHOO', 
     'ts': '1455915600', 
     'type': 'equity', 
     'utctime': '2016-02-19T21:00:00+0000', 
     'volume': '20734985'}}}]}} 

In [32]: sym = "AAPL" 
In [33]: r = requests.get("http://finance.yahoo.com/webservice/v1/symbols/{sym}/quote?format=json".format(sym=sym)) 
In [34]: r.json() 
Out[34]: 
{'list': {'meta': {'count': 1, 'start': 0, 'type': 'resource-list'}, 
    'resources': [{'resource': {'classname': 'Quote', 
    'fields': {'name': 'Apple Inc.', 
     'price': '96.040001', 
     'symbol': 'AAPL', 
     'ts': '1455915600', 
     'type': 'equity', 
     'utctime': '2016-02-19T21:00:00+0000', 
     'volume': '35374173'}}}]}} 

你可以通過使用比str.find更健壯的密鑰訪問你想要的任何數據。