为 html 表提取 lxml xpath

Posted

技术标签:

【中文标题】为 html 表提取 lxml xpath【英文标题】:Extracting lxml xpath for html table 【发布时间】:2011-07-31 23:21:57 【问题描述】:

我有一个类似于以下内容的 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 Over Flow 中类似示例之一的以下代码:

#############################
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') 不起作用。

【问题讨论】:

我发现了我的问题。不知何故, 标签被删除了。在 Firebug 中, 确实出现在 之后和 标记之前。 是的,这是一个常见问题解答:浏览器将强制性 (X)HTML 元素(如 headtbody)添加到 DOM。 顺便说一句,这正是 @ samplebias'answer 说。Python lxml XPath problem的可能重复
【参考方案1】:

您可能正在查看 Firebug 中的 HTML,对吗?当文档中不存在隐式标记&lt;tbody&gt; 时,浏览器将插入它。 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>]

【讨论】:

我在 Chrome 中也遇到过这种情况。在“检查”右键菜单中使用其Copy XPath 功能。有点傻。 您知道 FF/Chrome 中可能发生的任何其他“路径更改规则”吗?编译它们会很有趣。

以上是关于为 html 表提取 lxml xpath的主要内容,如果未能解决你的问题,请参考以下文章

爬虫—lxml提取数据

爬虫进阶数据提取-lxml模块(万能操作)

非结构化数据与结构化数据提取----XPath与lxml类库

Python知识点 - Xpath提取某个标签,需要转换为HTML。

谷歌浏览器直接提取的xpath,在python中为啥无法提取相应内容

谷歌浏览器直接提取的xpath,在python中为啥无法提取相应内容