提问人:Shaheeb Roshan 提问时间:3/3/2009 最后编辑:Cody Gray - on strikeShaheeb Roshan 更新时间:5/27/2013 访问量:13089
需要 python lxml 语法帮助来解析 html
Need python lxml syntax help for parsing html
问:
我是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 标签的信息?
答:
你没有在这个项目中使用Beautiful Soup是有原因的吗?这将使处理格式不完美的文件变得更加容易。
评论
好的,首先,关于解析 HTML:如果您遵循 zweiterlinde 和 S.Lott 的建议,至少使用 lxml 中包含的 beautifulsoup 版本。这样,您还将获得一个漂亮的 xpath 或 css 选择器界面的好处。
但是,我个人更喜欢 lxml 中包含的 Ian Bicking 的 HTML 解析器。
其次,来自试图与 ElementTree 兼容的 lxml,这两种方法在 ElementTree 中的 XPath 支持中进行了描述。.find()
.findall()
这两个函数相当容易使用,但它们的 XPath 非常有限。我建议尝试使用完整的 lxml xpath(
) 方法,或者,如果您已经熟悉 CSS,请使用 cssselect()
方法。
下面是一些示例,其中 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'))
评论
.//tr/*/a
.//tr//a
<tr><td><i><a href="...">..</a></i></td></tr>
评论