【问题标题】:Python/lxml/xpath for parsing Yahoo Finance用于解析 Yahoo Finance 的 Python/lxml/xpath
【发布时间】:2012-11-19 23:10:38
【问题描述】:

编辑:我已经提供了我用来解决这个问题的确切源代码。

我正在尝试使用 Python 2.7 和 lxml 从 Yahoo Finance 提取“总资产”数据。我试图从中提取此信息的页面示例是 http://finance.yahoo.com/q/bs?s=FAST+Balance+Sheet&annual

我已经成功地从 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

我能够从 Smartmoney 页面获取有关总资产的数据行,但是当我尝试解析 Yahoo Finance 页面时,我得到的只是一个空列表。

Smartmoney页面表格行源代码为:

    <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>

【问题讨论】:

    标签: python xpath lxml yahoo-finance


    【解决方案1】:

    包含语法错误,最后应该是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']
    

    在原始页面中,“总资产”&lt;strong&gt; 容器包含空格和换行符。在text() 结果上使用附加的normalize-space 函数,如下所示:

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

    【讨论】:

    • 您建议的命令没有给我任何错误,但它也不会产生任何结果 - 只是 '[]'。
    • soulseekah,我刚刚编辑了我的问题以提供一个脚本来剪切、粘贴和运行。这应该让您和其他人更容易看到我做错了什么并查看您的解决方案是否有效。
    • doc2.xpath('//td[strong[text()="Total Assets"]]/following-sibling::td/strong/text()') 不起作用。它仍然会导致一个空列表。
    • 啊,我知道是什么问题了! text() 根本不是您在示例中给出的"Total Assets",原始页面包含换行符和空格!
    • 谢谢,soulseekah!我忽略了白色的空间。为了任何有同样问题的人的利益,这里是有效的 xpath 代码: doc.xpath(u'.//th[div[contains (text(), "Total Assets")]]/following-sibling:: td/text()')
    猜你喜欢
    • 2010-12-07
    • 1970-01-01
    • 2012-07-29
    • 1970-01-01
    • 2017-09-06
    • 1970-01-01
    • 2012-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多