2013-03-25 229 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']