0

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

<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 解析器执行此操作,但因为 &something 在 xml 格式中是不可接受的,所以它不起作用……我尝试使用 html 解析器,但我没有弄清楚如何使其工作。

有谁知道我获得所需清单的好方法?

4

3 回答 3

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']
于 2013-03-25T01:10:16.620 回答
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>标签中)

于 2013-03-25T01:27:40.503 回答
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']
于 2013-03-25T01:37:19.040 回答