使用 Lxml 解析 HTML

Posted

技术标签:

【中文标题】使用 Lxml 解析 HTML【英文标题】:Parsing HTML with Lxml 【发布时间】:2011-04-03 21:44:43 【问题描述】:

我需要帮助从带有 lxml 的页面中解析出一些文本。我尝试了beautifulsoup,但我正在解析的页面的html 非常损坏,无法正常工作。所以我已经转向 lxml,但是文档有点混乱,我希望这里有人可以帮助我。

Here 是我要解析的页面,我需要获取“附加信息”部分下的文本。请注意,我在这个网站上有很多这样的页面要解析,每个页面的 html 并不总是完全相同(可能包含一些额外的空“td”标签)。任何关于如何获得该文本的建议都将非常感激。

感谢您的帮助。

【问题讨论】:

根据萤火虫xpath是:/html/body/table/tbody/tr/td/table/tbody/tr/td/table/tbody/tr/td/table/tbody/tr/td[2]/div/div[2]/table/tbody/tr/td/div/div/table/tbody/tr[8]/td[3]。您可能会从//*[@id="BelowTheFold"] 开始。我认为应该删除 tbodies。文本“附加信息”是否始终存在? 嗯,我对 xpath 不是很熟悉。是的,附加信息是文本始终存在。我知道的一件事是: td[3] 之类的东西不起作用,因为每个页面上的 html 并不完全一致。所以一页可能是 td[3],下一页可能是 td[4]。 【参考方案1】:
import lxml.html as lh
import urllib2

def text_tail(node):
    yield node.text
    yield node.tail

url='http://bit.ly/bf1T12'
doc=lh.parse(urllib2.urlopen(url))
for elt in doc.iter('td'):
    text=elt.text_content()
    if text.startswith('Additional  Info'):
        blurb=[text for node in elt.itersiblings('td')
               for subnode in node.iter()
               for text in text_tail(subnode) if text and text!=u'\xa0']
        break
print('\n'.join(blurb))

产量

65 多年来,Carl Stirn 的海军陆战队 一直在制定新的标准 划船的卓越和服务 享受。因为我们提供优质 商品,贴心,认真, 销售和服务,我们已经能够 让我们的客户成为我们的好 朋友。

我们 26,000 平方英尺的设施包括一个 完整的零件和配件 部门,全方位服务部门 (Merc. Premier 经销商,有 2 名全职 Mercruiser Master Tech's) 和新的, 二手和经纪销售。

编辑:这是基于 Steven D. Majewski 的 xpath 的替代解决方案,该解决方案解决了 OP 的评论,即将“附加信息”与简介分开的标签数量可能未知:

import lxml.html as lh
import urllib2

url='http://bit.ly/bf1T12'
doc=lh.parse(urllib2.urlopen(url))

blurb=doc.xpath('//td[child::*[text()="Additional  Info"]]/following-sibling::td/text()')

blurb=[text for text in blurb if text != u'\xa0']
print('\n'.join(blurb))

【讨论】:

你也可以使用:doc.xpath('(//td[descendant-or-self::*[text()="Additional Info"]])[last()]/following -sibling::td[2]/text()' ) 而不是迭代。 (该 xpath 可能比必要的更复杂 - 我试图避免依赖 或其他标签,与您的迭代代码相同。) 我能看到的唯一问题是 getnext().getnext(),因为每个页面上的 html 可能并不总是完全相同。一个页面在文本之间可能只有一个 td 标签,下一页可能有两个 td 标签。无论如何要遍历 tr 标签,直到找到带有附加信息文本的标签,然后去掉 html,您将只剩下文本......只有一个想法。 @Steven:感谢您提供 XPath。我还在努力学习 XPath,你的例子对我很有启发。 哇,谢谢。 xpath 是非常有趣的东西。借用你们俩的帮助。 @benEliott 这不是垃圾邮件。如果您要删除输出样本(为什么???),至少要正确执行。正在还原。

以上是关于使用 Lxml 解析 HTML的主要内容,如果未能解决你的问题,请参考以下文章

我究竟做错了啥?使用 lxml 解析 HTML

lxml / BeautifulSoup 解析器警告

Python 之lxml解析模块

使用 python 解析 HTML 表 - HTMLparser 或 lxml

Python通过Lxml库解析网络爬虫抓取到的html

HTML编码和lxml解析