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

Need python lxml syntax help for parsing html

提问人:Shaheeb Roshan 提问时间:3/3/2009 最后编辑:Cody Gray - on strikeShaheeb Roshan 更新时间:5/27/2013 访问量:13089

问:

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

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

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

        self.mySearchTables = self.mySearchTree.findall(".//table")
        self.myResultRows = self.mySearchTables[1].findall(".//tr")
    
  2. 我需要找到此表中包含的链接(这是我遇到困难的地方):

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

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

  3. 我需要链接的纯文本。我想,如果我真的首先得到了链接元素,那会是什么样子。searchLink.text

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

python html 解析 lxml

评论


答:

5赞 zweiterlinde 3/3/2009 #1

你没有在这个项目中使用Beautiful Soup是有原因的吗?这将使处理格式不完美的文件变得更加容易。

评论

2赞 Shaheeb Roshan 3/3/2009
我从美丽的汤开始,但我没有运气。我在问题中提到我的文档格式相当好,但它缺少结尾正文块。当我将其拉入解析器时,它只是删除了所有内容。因此 lxml。此外,tinyurl.com/37u9gu 表示使用 lxml 可以更好地管理内存
7赞 endolith 1/26/2010
我一开始用的是BeautifulSoup,但它并没有像它声称的那样处理糟糕的HTML。它也不支持具有多个类等的项目,lxml.html 更适合我用它所做的一切。
11赞 Humphrey Bogart 2/23/2011
BeautifulSoup (a) 未维护,(b) 比 lxml 慢,(c) 不如 lxml 强大。
2赞 ThiefMaster 3/29/2012
@BeauMartínez:我知道这篇文章已经有一年了,但只是为了让用户了解情况:BS目前处于维护状态;最近甚至还有一个新版本。它确实在内部使用 lxml,具体取决于您使用的构造函数参数。
27赞 Van Gale 3/3/2009 #2

好的,首先,关于解析 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'))

评论

0赞 Shaheeb Roshan 3/3/2009
耶!正是我需要的。我将cssselect解释为实际上要求元素具有声明的css类。嵌套的查找逻辑正是我所需要的!谢谢Van Gale!
0赞 endolith 1/26/2010
此页面建议使用带有 tag 选项的 iterchildren 和 iterdescendants。ibm.com/developerworks/xml/library/x-hiperfparse/#N10239
1赞 Charles Duffy 3/20/2012
很好的答案,但作为一个小小的狡辩——为什么而不是?前者将无法找到任何带有额外干预标签的内容,即。.//tr/*/a.//tr//a<tr><td><i><a href="...">..</a></i></td></tr>