2013-03-25 81 views
0

我需要一个给定的文件解析成字符串列表, 给定文件的风格是这样的:蟒蛇 - XML/HTML解析problam

<DOC> 
<DOCNUM> NUMBER </DOCNUM> 
<DOCTYPE> TYPE </DOCTYPE> 
<HEADER> 
&SOMETHING 
</HEADER> 
<BODY> 
<HEADLINE> 
SOME TEXT 
</HEADLINE> 
TEXT 
TEXT 
TEXT 
<TEXT> 
<P> 
INPUT TEXT1 
</P> 
<P> 
INPUT TEXT2 
</P> 
. 
. 
. 
</TEXT> 
</BODY> 
</DOC> 

我需要里面的所有的TEXTi实例的列表P标签外观。 我试图用lxml xml解析器来做这件事,但是因为&某些东西在xml格式中是不可接受的,所以它不起作用... 我尝试过使用html解析器,但是我没弄清楚如何使它工作。

没有人知道一个好的方法来获得我需要的清单吗?

回答

2

beautifulsoup似乎没有解析它的问题。

>>> from bs4 import BeautifulSoup as BS 
>>> from itertools import chain 

>>> doc = BS('''<DOC> 
<DOCNUM> NUMBER </DOCNUM> 
<DOCTYPE> TYPE </DOCTYPE> 
<HEADER> 
&SOMETHING 
</HEADER> 
<BODY> 
<HEADLINE> 
SOME TEXT 
</HEADLINE> 
TEXT 
TEXT 
TEXT 
<TEXT> 
<P> 

INPUT TEXT1 
</P> 
<P> 
INPUT TEXT2 
</P> 
. 
. 
. 
</TEXT> 
</BODY> 
</DOC>''') 

>>> list(chain(*[list(p.stripped_strings) for p in doc.find_all('p')])) 
[u'INPUT TEXT1', u'INPUT TEXT2'] 
0

您可以使用模块re其中进口正则表达式的功能:

import re 
strr="<DOC> <DOCNUM> NUMBER </DOCNUM> <DOCTYPE> TYPE </DOCTYPE> <HEADER> &SOMETHING </HEADER> <BODY> <HEADLINE> SOME TEXT </HEADLINE> TEXT TEXT TEXT <TEXT> <P> INPUT TEXT1 </P> <P> INPUT TEXT2 </P> . . . </TEXT> </BODY> </DOC>" 

arr = re.findall(r'<P>.*?</P>', strr) 
print arr 

这将工作,如果你没有嵌套<P>标签(但是,任何其他标签可以在<P>标签)

0

您可以使用recover=True选项忽略<HEADER>中的&

from lxml import etree 

doc = etree.parse(xmlish_file, parser=etree.XMLParser(recover=True)) 
print([p.text for p in doc.iter('P')]) 
# -> ['\nINPUT TEXT1\n', '\nINPUT TEXT2\n'] 

或者你可以将它解析为html。如果您对<p>内的所有文字感兴趣,您可以使用.text_content()代替.text

from lxml import html 

doc = html.parse(xmlish_file) 
print([p.text_content() for p in doc.iter('p')]) 
# -> ['\nINPUT TEXT1\n', '\nINPUT TEXT2\n']