解析html以获得整个段落,同时避免来自其他标签的中断

时间:2011-10-16 18:39:58

标签: python lxml

我已经问过question如何使用lxml来解析网址并获取<p>个元素。它已经解决了。但是,为了完全实现我的目标,我需要考虑<p>内其他标签的效果。

Acorn提供的解析网址并获得<p>的答案是:

import lxml.html

htmltree = lxml.html.parse('http://www.google.com/intl/en/about/corporate/index.html')

print htmltree.xpath('//p/text()')

但是,htmltree.xpath('//p/text()'),如果<p>段落中有其他标记,则会返回各个标记,并且其他标记之间的文本也会被忽略。

E.g。 <p>Text1... <a href="/link.../">hyperlinked text..</a> Text2....

目前,通过使用htmltree.xpath('//p/text()'),它会被解析为['Text1...','Text2...']
更直观地说,预期结果应为['Text1... hyperlinked text.. Text2...']

因此,我想知道,我应该使用哪些其他方法,将其解析成一个整体并以某种方式修复其他类型标记的中断,例如: <a>

我进一步研究了lxml xpath documentation,我怀疑这是因为/text()中的//p/text()。但是我被困在这里并且不知道要改变什么。

2 个答案:

答案 0 :(得分:4)

是的,/text()获取该标记中的直接文本元素。相反,获取所有p代码并使用.text_content()获取其中的所有文字。来自lxml.html doc:

  

.text_content():

     

返回元素的文本内容,包括   孩子的文本内容,没有标记。

所以你会有这样的事情:

import lxml.html

htmltree = lxml.html.parse('http://www.google.com/intl/en/about/corporate/index.html')

p_tags = htmltree.xpath('//p')
p_content = [p.text_content() for p in p_tags]

print p_content

答案 1 :(得分:1)

from xml.etree import ElementTree
from StringIO import StringIO

c = ElementTree.iterparse(StringIO('<html><p>hello <a href="">world</a></p>...</html>'))
for a,e in c:
    print '------------- DUMPING --------------'
    ElementTree.dump(e)
    print 'text: ', e.text
    print 'tail: ', e.tail
    print 'tag: ', e.tag

如果您的xml无效,请尝试安装lxml并将'xml.etree'更改为'lxml.etree'。

希望这有帮助。