我已经问过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()
。但是我被困在这里并且不知道要改变什么。
答案 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'。
希望这有帮助。