需要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语法