Python解析:lxml只能得到标记文本的一部分

问题描述:

我正在用Python处理Python,看起来像这样。我与LXML解析,但同样可以愉快地使用pyquery:Python解析:lxml只能得到标记文本的一部分

<p><span class="Title">Name</span>Dave Davies</p> 
<p><span class="Title">Address</span>123 Greyfriars Road, London</p> 

拉出“名称”和“地址”是死很容易,我使用什么库,但我如何得到本文的其余部分 - 即'戴夫戴维斯'?

每个元素都可以有一个text and a tail attribute(在链接,搜索单词 “尾巴”):

import lxml.etree 

content='''\ 
<p><span class="Title">Name</span>Dave Davies</p> 
<p><span class="Title">Address</span>123 Greyfriars Road, London</p>''' 


root=lxml.etree.fromstring(content,parser=lxml.etree.HTMLParser()) 
for elt in root.findall('**/span'): 
    print(elt.text, elt.tail) 

# ('Name', 'Dave Davies') 
# ('Address', '123 Greyfriars Road, London') 
+0

完美 - 谢谢! – AP257 2010-07-21 18:45:32

看一看BeautifulSoup。我刚开始使用它,所以我不是专家。关闭我的头顶:

import BeautifulSoup 

text = '''<p><span class="Title">Name</span>Dave Davies</p> 
      <p><span class="Title">Address</span>123 Greyfriars Road, London</p>''' 

soup = BeautifulSoup.BeautifulSoup(text) 

paras = soup.findAll('p') 

for para in paras: 
    spantext = para.span.text 
    othertext = para.span.nextSibling 
    print spantext, othertext 

[Out]: Name Dave Davies 
     Address 123 Greyfriars Road, London 
+0

感谢您的支持。我也喜欢BeautifulSoup,但我相信它不再被维护,所以我切换到lxml/pyquery。 – AP257 2010-07-21 18:45:57

另一种方法 - 使用XPath:

>>> from lxml import html 
>>> doc = html.parse(file) 
>>> doc.xpath('//span[@class="Title"][text()="Name"]/../self::p/text()') 
['Dave Davies'] 
>>> doc.xpath('//span[@class="Title"][text()="Address"]/../self::p/text()') 
['123 Greyfriars Road, London']