python - 解析problam的xml / html

时间:2013-03-25 00:43:00

标签: python xml parsing lxml

我需要将给定文件解析为字符串列表, 给定的文件样式是:

<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>

我需要列出P标签外观中的所有TEXTi实例。 我尝试使用lxml xml解析器执行此操作,但因为&amp;某些东西在xml格式中不可接受它不起作用... 我尝试使用html解析器,但我没有弄清楚如何使其工作。

有谁知道我得到我需要的清单的好方法?

3 个答案:

答案 0 :(得分: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']

答案 1 :(得分: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>标记中),这将有效

答案 2 :(得分: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']