作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我尝试获取起始 xml 标记和结束标记之间的全部内容。
获取像 title
这样的直接案例中的内容下面很简单,但是如果使用 mixed-content 并且我想保留内部标签,我怎样才能在标签之间获取全部内容 ?
<?xml version="1.0" encoding="UTF-8"?>
<review>
<title>Some testing stuff</title>
<text sometimes="attribute">Some text with <extradata>data</extradata> in it.
It spans <sometag>multiple lines: <tag>one</tag>, <tag>two</tag>
or more</sometag>.</text>
</review>
我要的是两个之间的内容text
标签,包括任何标签:Some text with <extradata>data</extradata> in it. It spans <sometag>multiple lines: <tag>one</tag>, <tag>two</tag> or more</sometag>.
目前我使用正则表达式,但它有点乱,我不喜欢这种方法。我倾向于基于 XML 解析器的解决方案。我看了minidom
, etree
, lxml
和 BeautifulSoup
但找不到这种情况的解决方案(全部内容,包括内部标签)。
最佳答案
这里有一些对我和你的样本有用的东西:
from lxml import etree
doc = etree.XML(
"""<?xml version="1.0" encoding="UTF-8"?>
<review>
<title>Some testing stuff</title>
<text>Some text with <extradata>data</extradata> in it.</text>
</review>"""
)
def flatten(seq):
r = []
for item in seq:
if isinstance(item,(str,unicode)):
r.append(unicode(item))
elif isinstance(item,(etree._Element,)):
r.append(etree.tostring(item,with_tail=False))
return u"".join(r)
print flatten(doc.xpath('/review/text/node()'))
产量:
Some text with <extradata>data</extradata> in it.
xpath选择<text>
的所有子节点元素,如果它们是字符串/unicode 子类 (<class 'lxml.etree._ElementStringResult'>
) 或调用 etree.tostring
,则直接将它们呈现为 unicode如果它是一个 Element
, with_tail=False
避免重复尾部。
您可能需要处理其他节点类型(如果存在)。
关于python - 如何在 Python 中获取两个 xml 标记之间的全部内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11122397/
我是一名优秀的程序员,十分优秀!