2010-06-02 42 views
1

我试图将使用xml.etree将使用大量表格的XHTML文档转换为Python中的语义XML文档。不过,我有一些麻烦,这个XHTML解析元素内部为空元素的文本

<TD> 
    Textline1<BR/> 
    Textline2<BR/> 
    Textline3 
</TD> 

转换为这样的事情

<lines> 
    <line>Textline1</line> 
    <line>Textline2</line> 
    <line>Textline3</line> 
</lines> 

的问题是,我不知道如何让BR元素之后的文本。

回答

1

您需要使用<BR>元素的.tail财产。

import xml.etree.ElementTree as et 

doc = """<TD> 
    Textline1<BR/> 
    Textline2<BR/> 
    Textline3 
</TD> 
""" 

e = et.fromstring(doc) 

items = [] 
for x in e.getiterator(): 
    if x.text is not None: 
     items.append(x.text.strip()) 
    if x.tail is not None: 
     items.append(x.tail.strip()) 

doc2 = et.Element("lines") 
for i in items: 
    l=et.SubElement(doc2, "line") 
    l.text = i 

print(et.tostring(doc2)) 
+0

aarrgghh使用'如果foo是不无:''不富,如果= None' – 2010-06-02 22:32:01

+0

当然,你是对的约翰,我通常会!我刚刚花了最后9个小时编码Java,所以我滑倒:( – EnigmaCurry 2010-06-02 23:57:21

+1

你必须犯下一个非常严重的罪行才值得用9小时的Java编码这样的句子。 – 2010-06-03 01:12:06

0

我不认为标签为空是您的问题。 xml.etree可能不希望您将子元素和纯文本节点混合在一起。

BeautifulSoup是伟大的解析XML或HTML是格式不正确:

import BeautifulSoup 
soup = BeautifulSoup.BeautifulSoup(open('in.html').read()) 
print "\n".join(["<line>%s</line>" % node.strip() for node in soup.find('td').contents if isinstance(node, BeautifulSoup.NavigableString)])