Python 用Lxml解析HTML

Python 用Lxml解析HTML,python,html,parsing,lxml,Python,Html,Parsing,Lxml,我需要帮助用lxml解析出页面中的一些文本。我尝试了beautifulsoup,但我正在解析的页面的html太糟糕了,无法正常工作。所以我转到了lxml,但是文档有点混乱,我希望这里的人能帮助我 是我试图解析的页面,我需要获取“附加信息”部分下的文本。注意,我在这个站点上有很多这样的页面需要解析,每个页面的html并不总是完全相同的(可能包含一些额外的空“td”标记)。关于如何获得该文本的任何建议都将不胜感激 谢谢你的帮助 import lxml.html as lh import urllib

我需要帮助用lxml解析出页面中的一些文本。我尝试了beautifulsoup,但我正在解析的页面的html太糟糕了,无法正常工作。所以我转到了lxml,但是文档有点混乱,我希望这里的人能帮助我

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

谢谢你的帮助

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年来,卡尔·斯蒂恩一直是海军陆战队员 一直在制定新的工作标准 卓越的划船服务 享受。因为我们提供高质量的服务 商品,关怀,认真, 销售和服务,我们已经能够 让我们的客户成为我们的好客户 朋友们

我们26000平方英尺的设施包括 配件齐全 全方位服务部 (Merc.卓越经销商,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))

根据firebug的说法,xpath是:
/html/body/table/tbody/tr/td/table/tbody/tr/td/table/tbody/tr/td/table/tbody/tr/td[2]/div/div/div/tr/td/div/table/tbody/tr[8]/td[3]
。您可能从
/*[@id=“BelowTheFold”]
开始。我认为应该把这些桶拆了。文本“附加信息”总是存在吗?嗯,我对xpath不是很熟悉。是的,附加信息是文本始终存在。我知道的一件事是:td[3]之类的东西不起作用,因为html在每个页面上并不完全一致。因此,一个页面可能是td[3],下一个页面可能是td[4]。您还可以使用:doc.xpath('(//td[substant或self::*[text()=“Additional Info”]])[last()]/following sibling::td[2]/text()'),而不是迭代。(xpath可能比必要的更复杂——我试图避免依赖于或其他标记,这与您的迭代代码相同。)我看到的唯一问题是getnext().getnext(),因为每个页面上的html可能并不总是完全相同的。一个页面的文本之间可能只有一个td标签,下一个页面可能有两个td标签。在你找到一个包含额外信息文本的标签,然后去掉html,剩下的就只有文本了,你还需要对tr标签进行iter吗。。。史蒂文:谢谢你的建议。我还在努力学习XPath,你的例子对我很有启发性。哇,谢谢你。xpath是非常有趣的东西。从你们两人那里获得帮助。@benEliott这不是垃圾邮件。如果要删除输出样本(为什么??),至少要正确地执行。回复。