需要python lxml语法帮助来解析html

Posted

技术标签:

【中文标题】需要python lxml语法帮助来解析html【英文标题】:Need python lxml syntax help for parsing html 【发布时间】:2010-10-10 20:06:12 【问题描述】:

我是 python 的新手,我需要一些关于使用 lxml 查找和迭代 html 标签的语法方面的帮助。以下是我正在处理的用例:

HTML 文件格式良好(但并不完美)。屏幕上有多个表格,一个包含一组搜索结果,一个用于页眉和页脚。每个结果行都包含一个搜索结果详细信息的链接。

    我需要找到带有搜索结果行的中间表(我能够弄清楚这一行):

        self.mySearchTables = self.mySearchTree.findall(".//table")
        self.myResultRows = self.mySearchTables[1].findall(".//tr")
    

    我需要找到此表中包含的链接(这是我卡住的地方):

        for searchRow in self.myResultRows:
            searchLink = patentRow.findall(".//a")
    

    它似乎并没有真正找到链接元素。

    我需要链接的纯文本。我想如果我真的首先得到链接元素,它会类似于searchLink.text

最后,在 lxml 的实际 API 参考中,我无法找到有关 find 和 findall 调用的信息。我从在谷歌上找到的一些代码中收集到了这些。我是否遗漏了有关如何使用 lxml 有效查找和迭代 HTML 标记的内容?

【问题讨论】:

【参考方案1】:

好的,首先,关于解析 HTML:如果您遵循 zweiterlinde 和 S.Lott 的建议,至少使用 beautifulsoup included with lxml 的版本。这样,您还将受益于一个不错的 xpath 或 css 选择器界面。

不过,我个人更喜欢 Ian Bicking 的 HTML parser included in lxml。

其次,.find().findall()来自lxml试图兼容ElementTree,这两种方法在XPath Support in ElementTree中有描述。

这两个函数相当容易使用,但它们的 XPath 非常有限。我建议尝试使用完整的 lxml xpath() method,或者,如果您已经熟悉 CSS,请使用 cssselect() method。

以下是一些示例,其中的 HTML 字符串解析如下:

from lxml.html import fromstring
mySearchTree = fromstring(your_input_string)

使用 css 选择器类,您的程序大致如下所示:

# Find all 'a' elements inside 'tr' table rows with css selector
for a in mySearchTree.cssselect('tr a'):
    print 'found "%s" link to href "%s"' % (a.text, a.get('href'))

使用 xpath 方法的等价物是:

# Find all 'a' elements inside 'tr' table rows with xpath
for a in mySearchTree.xpath('.//tr/*/a'):
    print 'found "%s" link to href "%s"' % (a.text, a.get('href'))

【讨论】:

耶!正是我需要的。我将 cssselect 解释为实际上要求元素具有声明的 css 类。嵌套查找逻辑正是我所需要的!谢谢范盖尔! 本页推荐使用带有标签选项的iterchildren和iterdescendants。 ibm.com/developerworks/xml/library/x-hiperfparse/#N10239 很好的答案,但作为一个小问题——为什么.//tr/*/a而不是.//tr//a?前者将无法找到任何带有额外干预标签的东西,即。 <tr><td><i><a href="...">..</a></i></td></tr>【参考方案2】:

您没有为此项目使用Beautiful Soup 有什么原因吗?这将使处理不完善的文档变得更加容易。

【讨论】:

我从 Beautiful Soup 开始,但没有运气。我在我的问题中提到我的文档格式相当完善,但它缺少结尾的正文块。当我将其拉入解析器时,它只会删除所有内容。因此lxml。此外,tinyurl.com/37u9gu 表示使用 lxml 更好的 mem mgmt 一开始我使用的是 BeautifulSoup,但它并没有像它声称的那样处理糟糕的 HTML。它也不支持具有多个类的项目等。lxml.html 对我所做的一切都更好。 BeautifulSoup (a) 未维护,(b) 比 lxml 慢,(c) 不如 lxml 强大。 @BeauMartínez:我知道这篇文章已经有一年了,但只是为了让用户了解情况:BS 目前维护;最近甚至还有一个新版本。它确实在内部使用 lxml,具体取决于您使用的构造函数参数。

以上是关于需要python lxml语法帮助来解析html的主要内容,如果未能解决你的问题,请参考以下文章

Python爬虫:通过爬取CSDN博客信息,学习lxml库与XPath语法

Python爬虫:通过爬取CSDN博客信息,学习lxml库与XPath语法

Python爬虫利器三之Xpath语法与lxml库的用法

Python爬虫利器三之Xpath语法与lxml库的用法

学习笔记Python - Lxml

Python操作XML和HTML,LXML类库的使用