用Lxml解析HTML
我需要帮助,从一个页面中提取一些文本,使用的是lxml库。我之前试过beautifulsoup,但那个页面的HTML结构太乱了,所以没法用。现在我转向了lxml,但它的文档有点让人困惑,我希望这里有人能帮我。
这是我想要解析的页面,我需要获取“附加信息”部分下面的文本。需要注意的是,这个网站上有很多类似的页面要解析,而且每个页面的HTML结构不一定完全相同(可能会有一些多余的空“td”标签)。如果有人能给我一些建议,告诉我怎么获取那个文本,我会非常感激。
谢谢大家的帮助。
1 个回答
16
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年的历史了,一直在为船只娱乐设定新的卓越和服务标准。因为我们提供优质的商品,热心、细心的销售和服务,所以我们能够让我们的客户成为好朋友。
我们的设施面积达到26,000平方英尺,里面有一个完整的零件和配件部门,还有一个全方位的服务部门(我们是Merc. Premier经销商,拥有两名全职的Mercruiser大师技术人员),同时还提供新车、二手车和经纪销售。
编辑: 这里有一个基于Steven D. Majewski的xpath的替代解决方案,解决了提问者评论中提到的“额外信息”和简介之间的标签数量可能不确定的问题:
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))