作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Python 3.4,使用 etree.iterparse 解析 GB++ 大小的 XML Wikipedia 转储文件。我想在当前匹配的<page>
内进行测试其 <ns>
的元素值,具体取决于后一个值,然后我想要导出整个 <page>
的源 XML对象及其所有内容,包括嵌套在其中的任何元素,即整篇文章的 XML。
我可以迭代<page>
对象并找到我想要的对象,但所有可用的函数似乎都想读取文本/属性值,而我只想要源文件 XML 代码的 utf8 字符串副本,以获得完整的范围 <page>
目的。这可能吗?
XML 的简化版本如下所示:
<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.10/" xml:lang="en">
<page>
<title>Some Article</title>
<ns>0</ns>
<revision>
<timestamp>2017-07-27T00:59:41Z</timestamp>
<text xml:space="preserve">some text</text>
</revision>
</page>
<page>
<title>User:Wonychifans</title>
<ns>2</ns>
<revision>
<text xml:space="preserve">blah blah</text>
</revision>
</page>
</mediawiki>
Python 代码让我到达 <ns>
值(value)测试在这里:
``from lxml import etree
# store namespace string for all elements (only one used in Wikipedia XML docs)
NAMESPACE = '{http://www.mediawiki.org/xml/export-0.10/}'
ns = {'wiki' : 'http://www.mediawiki.org/xml/export-0.10/'}
context = etree.iterparse('src.xml', events=('end',))
for event, elem in context:
# at end of parsing each
if elem.tag == (NAMESPACE+'page') and event == 'end':
tagNs = elem.find('wiki:ns',ns)
if tagNs is not None:
nsValue = tagNs.text
if nsValue == '2':
# export the current <page>'s XML code
在本例中,我只想提取第二个 <page>
的 XML 代码。元素,即包含以下内容的字符串:
<page>
<title>User:Wonychifans</title>
<ns>2</ns>
<revision>
<text xml:space="preserve">blah blah</text>
</revision>
</page>
编辑:轻微的拼写错误和更好的标记
最佳答案
你可以做到这一点。
>>> from lxml import etree
>>> mediawiki = etree.iterparse('mediawiki.xml')
>>> page_content = {}
>>> for ev, el in mediawiki:
... if el.tag=='page':
... if page_content['ns']=='2':
... print (page_content)
... page_content = {}
... else:
... page_content[el.tag.replace('{http://www.mediawiki.org/xml/export-0.10/}', '')] = \
... el.text.strip() if el.text else None
...
>>> page_content
{'mediawiki': '', 'revision': '', 'timestamp': '2017-07-27T00:59:41Z', 'title': 'User:Wonychifans', 'page': '', 'text': 'blah blah', 'ns': '2'}
由于输出 xml 的结构非常简单,因此从字典构建它应该没有困难。
编辑:虽然此方法需要两次遍历 xml 文件,但它可能会更快,并且确实恢复了所需的 xml。
首先,查找 page
元素的起始行。
>>> from lxml import etree
>>> mediawiki = etree.iterparse('mediawiki.xml', events=("start", "end"))
>>> for ev, el in mediawiki:
... tag = el.tag[1+el.tag.rfind('}'):]
... if ev=='start' and tag=='page':
... keep=False
... if ev=='start' and tag=='ns' and el.text=='2':
... keep=True
... if ev=='end' and tag=='page' and keep:
... print (el.sourceline)
...
10
再次浏览 xml,使用起始点查找完整的 page
条目。
>>> with open('mediawiki.xml') as mediawiki:
... for _ in range(9):
... r = next(mediawiki)
... for line in mediawiki:
... print (line.strip())
... if '</page>' in line:
... break
...
<page>
<title>User:Wonychifans</title>
<ns>2</ns>
<revision>
<text xml:space="preserve">blah blah</text>
</revision>
</page>
关于Python tree.iterparse 导出所选元素(包括所有后代)的源 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47203492/
我正在尝试用 Swift 编写这段 JavaScript 代码:k_combinations 到目前为止,我在 Swift 中有这个: import Foundation import Cocoa e
我是一名优秀的程序员,十分优秀!