2012-12-02 79 views
0

編輯:我提供了我正在使用的精確源代碼來試圖找出這個問題。用於解析雅虎財務的Python/lxml/xpath

我試圖從雅虎財經使用Python 2.7和lxml提取有關「總資產」的數據。我試圖從中提取此信息的頁面示例是http://finance.yahoo.com/q/bs?s=FAST+Balance+Sheet &年度

我已經成功地從Smartmoney中提取了有關「總資產」的數據。我能夠解析的Smartmoney頁面的一個示例是http://www.smartmoney.com/quote/FAST/?story=financials & timewindow = 1 & opt = YB & isFinprint = 1 & framework.view = smi_emptyView

這裏是一個特殊的測試腳本,我成立了處理這個問題:

import urllib 
    import lxml 
    import lxml.html 

    url_local1 = "http://www.smartmoney.com/quote/FAST/?story=financials&timewindow=1&opt=YB&isFinprint=1&framework.view=smi_emptyView" 
    result1 = urllib.urlopen(url_local1) 
    element_html1 = result1.read() 
    doc1 = lxml.html.document_fromstring (element_html1) 
    list_row1 = doc1.xpath(u'.//th[div[text()="Total Assets"]]/following-sibling::td/text()') 
    print list_row1 

    url_local2 = "http://finance.yahoo.com/q/bs?s=FAST" 
    result2 = urllib.urlopen(url_local2) 
    element_html2 = result2.read() 
    doc2 = lxml.html.document_fromstring (element_html2) 
    list_row2 = doc2.xpath(u'.//td[strong[text()="Total Assets"]]/following-sibling::td/strong/text()') 
    print list_row2 

我能夠得到從財智頁面總資產的數據行,但我得到的只是一個空列表,當我嘗試解析雅虎財經頁面。

的財智月刊頁面上的錶行的源代碼是:

<tr class="odd bold"> 
<th><div style='font-weight:bold'>Total Assets</div></th> 
<td> 1,684,948</td> 
<td> 1,468,283</td>         
<td> 1,327,358</td>         
<td> 1,304,149</td>          
<td> 1,163,061</td> 
    </tr> 

雅虎頁面上的錶行的源代碼是:

<tr> 
<td colspan="2"><strong>Total Assets</strong></td> 
<td align="right"><strong>1,684,948&nbsp;&nbsp;</strong></td> 
<td align="right"><strong>1,468,283&nbsp;&nbsp;</strong></td> 
<td align="right"><strong>1,327,358&nbsp;&nbsp;</strong></td> 
    </tr> 

回答

0

包含語法錯誤,應該是td/strong/text()在結尾,再加上你有一個尾隨]。我想說的是正確的查詢將是:

xpath('//td[strong[text()="Total Assets"]]/following-sibling::td/strong/text()') 

結果:

>>> tree.xpath('//td[strong[text()="Total Assets"]]/following-sibling::td/strong/text()') 
[u'1,684,948\xa0\xa0', u'1,468,283\xa0\xa0', u'1,327,358\xa0\xa0'] 

在原始頁面中的「總資產」 <strong>容器有空格和換行。在text()上使用normalize-space函數,如下所示:

xpath('//td[strong[normalize-space(text())="Total Assets"]]/following-sibling::td/strong/text()') 
+0

你會得到什麼錯誤? – soulseekah

+0

您建議的命令不會給我任何錯誤,但它也不會產生任何結果 - 只是'[]'。 – jhsu802701

+0

soulseekah,我剛剛編輯我的問題,提供腳本來剪切,粘貼和運行。這會讓你和其他人更容易看到我做錯了什麼,並查看你的解決方案是否有效。 – jhsu802701