Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.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标记,只保留标记之间的文本_Python_Xml - Fatal编程技术网

Python 删除所有XML标记,只保留标记之间的文本

Python 删除所有XML标记,只保留标记之间的文本,python,xml,Python,Xml,我有一个XML(实际上是一个XML样式表)。 对于Python,我希望从中删除所有标记,只保留标记之间的文本 最简单的解决方案是什么? 我在这里看到了一个类似的问题: 但出于某种原因,这在这种情况下似乎不起作用。 请注意,我不希望在标记中保留以引号分隔的文本-我确实希望删除以“.”开头的所有内容。使用(或更快的等效API),然后使用etree.totext(tree,method='text')函数将树序列化回文本内容: >>> from xml.etree import E

我有一个XML(实际上是一个XML样式表)。 对于Python,我希望从中删除所有标记,只保留标记之间的文本

最简单的解决方案是什么? 我在这里看到了一个类似的问题:

但出于某种原因,这在这种情况下似乎不起作用。 请注意,我不希望在标记中保留以引号分隔的文本-我确实希望删除以“.”开头的所有内容。

使用(或更快的等效API),然后使用
etree.totext(tree,method='text')
函数将树序列化回文本内容:

>>> from xml.etree import ElementTree as ET
>>> doc='''\
... <?xml-stylesheet href="common.css"?>
... <?xml-stylesheet href="modern.css"
...   title="Modern" media="screen"
...   type="text/css"?>
... <?xml-stylesheet href="classic.css"
...   alternate="yes" title="Classic"
...   media="screen, print" type="text/css"?>
... <ARTICLE>
...   <HEADLINE>Fredrick the Great meets
...     Bach</HEADLINE>
...   <AUTHOR>Johann Nikolaus Forkel</AUTHOR>
...   <PARA>
...     One evening, just as he was
...     getting his
...     <INSTRUMENT>flute</INSTRUMENT>
...     ready and his musicians were
...     assembled, an officer brought him a
...     list of the strangers who had arrived.
...   </PARA>
... </ARTICLE>
... '''
>>> tree = ET.fromstring(doc)
>>> ET.tostring(tree, method='text')
'\n  Fredrick the Great meets\n    Bach\n  Johann Nikolaus Forkel\n  \n    One evening, just as he was\n    getting his\n    flute\n    ready and his musicians were\n    assembled, an officer brought him a\n    list of the strangers who had arrived.\n  \n'
>从xml.etree导入元素树作为ET
>>>doc='''\
... 
... 
... 
... 
...   弗雷德里克大帝会见
...     巴赫
...   约翰·尼古拉斯·福克尔
...   
...     一天晚上,就像他一样
...     得到他的
...     长笛
...     准备好了,他的乐手们都准备好了
...     集合后,一名军官给他带来了一辆汽车
...     已经到达的陌生人名单。
...   
... 
... '''
>>>tree=ET.fromstring(doc)
>>>ET.tostring(树,方法='text')
“\n弗雷德里克大帝会见巴赫约翰·尼古拉斯·福克尔一天晚上,正当他准备好长笛和他的音乐家们聚集在一起时,一名军官给他带来了一份来过的陌生人名单。\n\n”

Lxml可能会有问题,您可以使用标准库中的ElementTree或C版本cElementTree执行Martijn Pieters所说的操作

>>> from xml.etree import ElementTree
>>> doc='''
...  <?xml-stylesheet href="common.css"?>
...  <?xml-stylesheet href="modern.css"
...    title="Modern" media="screen"
...    type="text/css"?>
...  <?xml-stylesheet href="classic.css"
...    alternate="yes" title="Classic"
...    media="screen, print" type="text/css"?>
...  <ARTICLE>
...    <HEADLINE>Fredrick the Great meets
...      Bach</HEADLINE>
...    <AUTHOR>Johann Nikolaus Forkel</AUTHOR>
...    <PARA>
...      One evening, just as he was
...      getting his
...      <INSTRUMENT>flute</INSTRUMENT>
...      ready and his musicians were
...      assembled, an officer brought him a
...      list of the strangers who had arrived.
...    </PARA>
...  </ARTICLE>
...  '''

>>> xml = ElementTree.fromstring(doc)
>>> xml
<Element 'ARTICLE' at 0x9295e6c>
>>> ElementTree.tostring(xml,method='text')
'\n   Fredrick the Great meets\n     Bach\n   Johann Nikolaus Forkel\n   \n     One evening, just as he was\n     getting his\n     flute\n     ready and his musicians were\n     assembled, an officer brought him a\n     li
st of the strangers who had arrived.\n   \n '
>来自xml.etree导入元素树
>>>doc='''
...  
...  
...  
...  
...    弗雷德里克大帝会见
...      巴赫
...    约翰·尼古拉斯·福克尔
...    
...      一天晚上,就像他一样
...      得到他的
...      长笛
...      准备好了,他的乐手们都准备好了
...      集合后,一名军官给他带来了一辆汽车
...      已经到达的陌生人名单。
...    
...  
...  '''
>>>xml=ElementTree.fromstring(doc)
>>>xml
>>>tostring(xml,method='text')
“\n弗雷德里克大帝会见巴赫约翰·尼古拉斯·福克尔一天晚上,正当他准备好长笛和他的音乐家们聚集在一起时,一名军官给他带来了一个李
到达的第一个陌生人。\n\n
请注意,cElementTree速度更快,它位于标准库中,但我认为它与UTF8有一些问题,因此如果需要UTF8,请使用“ElementTree”

,您可以使用:

从xml.parsers.expat导入ParserCreate
def char_数据(数据):
if data.strip():#如果需要,请跳过空文本
打印数据
parser=ParserCreate()
parser.CharacterDataHandler=char\u数据
parser.Parse(doc,True)
或:

从xml.sax导入make_解析器,处理程序
类提取文本(handler.ContentHandler):
def字符(自身、数据):
if data.strip():
打印数据
parser=make_parser()
parser.setContentHandler(extract_text())
parser.feed(doc)
如果它不是格式良好的XML,您也可以尝试以下方法:

从HTMLParser导入HTMLParser
类提取文本(HTMLPasser):
def句柄_数据(自身、数据):
if data.strip():
打印数据
parser=extract_text()
parser.feed(doc)

获得了您想要从中剥离内容的文件/文档的示例?谢谢-似乎是一个不错的解决方案。但是,当字符“&”首次出现在文本中(不是在标记中)时,这将阻塞,并出现以下错误:xml.parsers.expat.expat错误:格式不正确(无效标记):第701行,第1列778@calvintigerHTMLPasser没有那么严格,可以处理
&
。试试看,也许它适用于(格式错误的)XML文档。或者,您可以尝试在将XML传递给严格的解析器之前修复它。