Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python-xml/html解析问题_Python_Xml_Parsing_Lxml - Fatal编程技术网

python-xml/html解析问题

python-xml/html解析问题,python,xml,parsing,lxml,Python,Xml,Parsing,Lxml,我需要将给定文件解析为字符串列表, 给定的文件样式如下所示: <DOC> <DOCNUM> NUMBER </DOCNUM> <DOCTYPE> TYPE </DOCTYPE> <HEADER> &SOMETHING </HEADER> <BODY> <HEADLINE> SOME TEXT </HEADLINE> TEXT TEXT TEXT <TEXT&g

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

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

数
类型
&某物
一些文本
正文
正文
正文

输入文本1

输入文本2

. . .
我需要列出p标记外观中的所有TEXTi实例。 我试着用lxmlxml解析器来做这件事,但是因为&在xml格式中有些东西是不可接受的,所以它不起作用。。。 我尝试使用html解析器,但我没有弄清楚如何使其工作

有人知道有什么好办法让我得到我需要的名单吗

解析它似乎没有问题

>>> 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']
>>从bs4导入BeautifulSoup作为BS
>>>来自itertools进口链
>>>doc=BS(“”)
数
类型
&某物
一些文本
正文
正文
正文

输入文本1

输入文本2

. . . ''') >>>列表(链(*[文档中p的列表(p.stripped_字符串)查找所有('p')])) [u'INPUT TEXT1',u'INPUT TEXT2']
您可以使用模块
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
重新导入
strr=“数字类型&一些文本

输入文本1

输入文本2

.” arr=re.findall(r'

*?

',strr) 打印arr

如果您没有嵌套的
标记(但是,任何其他标记都可以位于
标记中)

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

从lxml导入etree
doc=etree.parse(xmlish_文件,parser=etree.XMLParser(recover=True))
打印([doc.iter('p')中p的p.text]
#->['\nINPUT TEXT1\n','\nINPUT TEXT2\n']
或者可以将其解析为html。如果您对
中的所有文本感兴趣;您可以使用
.text\u content()
而不是
.text

从lxml导入html
doc=html.parse(xmlish_文件)
打印([p.text_content(),用于文档iter('p')中的p)
#->['\nINPUT TEXT1\n','\nINPUT TEXT2\n']