提取HTML表格的lxml xpath

18

我有一个类似于以下的HTML文档:

<html xmlns="http://www.w3.org/1999/xhtml" xmlns="http://www.w3.org/1999/xhtml">
    <div id="Symbols" class="cb">
    <table class="quotes">
    <tr><th>Code</th><th>Name</th>
        <th style="text-align:right;">High</th>
        <th style="text-align:right;">Low</th>
    </tr>
    <tr class="ro" onclick="location.href='/xyz.com/A.htm';" style="color:red;">
        <td><a href="/xyz.com/A.htm" title="Display,A">A</a></td>
        <td>A Inc.</td>
        <td align="right">45.44</td>
        <td align="right">44.26</td>
    <tr class="re" onclick="location.href='/xyz.com/B.htm';" style="color:red;">
        <td><a href="/xyz.com/B.htm" title="Display,B">B</a></td>
        <td>B Inc.</td>
        <td align="right">18.29</td>
        <td align="right">17.92</td>
</div></html>

我需要从表格中提取code/name/high/low信息。

我使用了Stack Overflow上类似示例中的以下代码:

#############################
import urllib2
from lxml import html, etree

webpg = urllib2.urlopen(http://www.eoddata.com/stocklist/NYSE/A.htm).read()
table = html.fromstring(webpg)

for row in table.xpath('//table[@class="quotes"]/tbody/tr'):
    for column in row.xpath('./th[position()>0]/text() | ./td[position()=1]/a/text() | ./td[position()>1]/text()'):
        print column.strip(),
    print

#############################

我的输出为空。我需要将第一个循环的xpath从table.xpath('//table[@class="quotes"]/tbody/tr')更改为table.xpath('//tr')

我只是不明白为什么xpath('//table[@class="quotes"]/tbody/tr')不起作用。


我找到了问题所在。不知何故,<tbody>标签被删除了。从Firebug中可以看到,在<table class="quotes">和<tr>标签之间,<tbody>确实出现了。 - mkt2012
是的,这是一个常见问题:浏览器会向DOM中添加强制性的(X)HTML元素(例如headtbody)。顺便说一下,这正是@samplebias的答案所说的。 - user357812
可能是Python lxml XPath问题的重复。 - user357812
1个回答

43

您可能正在使用Firebug查看HTML,是吗? 当文档中不存在时,浏览器会插入隐式标签<tbody>。 lxml库仅处理原始HTML字符串中存在的标签。

在XPath中省略tbody级别。例如,这样可以工作:

tree = lxml.html.fromstring(raw_html)
tree.xpath('//table[@class="quotes"]/tr')
[<Element tr at 1014206d0>, <Element tr at 101420738>, <Element tr at 1014207a0>]

6
我也在使用Chrome时遇到了这个问题。我在“检查”右键菜单中使用了它的“复制XPath”功能。有点古怪。 - ficuscr
你知道在FF/Chrome中可能发生的其他“路径变化规则”吗?编制它们将会很有趣。 - lajarre

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接