我需要将给定文件解析为字符串列表, 给定的文件样式是:
<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解析器,但我没有弄清楚如何使其工作。
有谁知道我得到我需要的清单的好方法?
答案 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']