[英]Python XML distinct list of child tags values
我正在編寫第一個Python XML查詢,但沒有成功。 我有以下代碼:
import xml.etree.ElementTree as ET
root = ET.parse(r'wiktionary.xml').getroot()
s = set()
for ns_tag in root.findall('page/ns'):
value = ns_tag.text
s.add(value)
for page_tag in root.findall('page'):
print(page_tax.find('ns').text)
XML的形式
<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.10/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.10/ http://www.mediawiki.org/xml/export-0.10.xsd" version="0.10" xml:lang="af">
<siteinfo>
<sitename>Wiktionary</sitename>
<dbname>afwiktionary</dbname>
<base>https://af.wiktionary.org/wiki/Tuisblad</base>
<generator>MediaWiki 1.33.0-wmf.19</generator>
<case>case-sensitive</case>
<namespaces>
<namespace key="-2" case="case-sensitive">Media</namespace>
<namespace key="-1" case="first-letter">Spesiaal</namespace>
<namespace key="0" case="case-sensitive" />
<namespace key="1" case="case-sensitive">Bespreking</namespace>
<namespace key="2" case="first-letter">Gebruiker</namespace>
<namespace key="3" case="first-letter">Gebruikerbespreking</namespace>
<namespace key="4" case="case-sensitive">Wiktionary</namespace>
<namespace key="5" case="case-sensitive">Wiktionarybespreking</namespace>
<namespace key="6" case="case-sensitive">Lêer</namespace>
<namespace key="7" case="case-sensitive">Lêerbespreking</namespace>
<namespace key="8" case="first-letter">MediaWiki</namespace>
<namespace key="9" case="first-letter">MediaWikibespreking</namespace>
<namespace key="10" case="case-sensitive">Sjabloon</namespace>
<namespace key="11" case="case-sensitive">Sjabloonbespreking</namespace>
<namespace key="12" case="case-sensitive">Hulp</namespace>
<namespace key="13" case="case-sensitive">Hulpbespreking</namespace>
<namespace key="14" case="case-sensitive">Kategorie</namespace>
<namespace key="15" case="case-sensitive">Kategoriebespreking</namespace>
<namespace key="828" case="case-sensitive">Module</namespace>
<namespace key="829" case="case-sensitive">Module talk</namespace>
<namespace key="2300" case="case-sensitive">Gadget</namespace>
<namespace key="2301" case="case-sensitive">Gadget talk</namespace>
<namespace key="2302" case="case-sensitive">Gadget definition</namespace>
<namespace key="2303" case="case-sensitive">Gadget definition talk</namespace>
</namespaces>
</siteinfo>
<page>
<title>MediaWiki:Edithelppage</title>
<ns>8</ns>
<id>21</id>
<revision>
<id>17266</id>
<parentid>3081</parentid>
<timestamp>2006-06-23T20:14:26Z</timestamp>
<contributor>
<username>Manie</username>
<id>18</id>
</contributor>
<minor />
<comment>typo</comment>
<model>wikitext</model>
<format>text/x-wiki</format>
<text xml:space="preserve">{{ns:4}}:Redigeer</text>
<sha1>nrxi3shwkpass1der614rzu1wcrjdok</sha1>
</revision>
</page>
<page>
<title>MediaWiki:Sitesubtitle</title>
<ns>8</ns>
<id>70</id>
<revision>
<id>17618</id>
<parentid>7587</parentid>
<timestamp>2006-06-26T16:10:58Z</timestamp>
<contributor>
<username>Manie</username>
<id>18</id>
</contributor>
<model>wikitext</model>
<format>text/x-wiki</format>
<text xml:space="preserve">Die vrye woordeboek</text>
<sha1>3gmth4w27p5u4mdo8yo8qbb2cj47l1b</sha1>
</revision>
</page>
</mediawiki>
此代碼也不會顯示任何內容:
from lxml import etree
tree = etree.parse(r'E:\Downloads\WikipediaAF\test2.xml')
root = tree.getroot()
for ns_tag in root.findall('page'):
for tag in ns_tag.getchildren():
if tag.tag == 'ns':
print(tag.text)
我正在嘗試提取<ns>
標記之間的值的不同列表,但set s
返回為空,並且也不打印任何內容。
有人知道我要去哪里錯嗎?
如果我正確理解了您的問題,請嘗試一下(與您的方法有些不同,但我更習慣了...):
wik = """
<mediawiki>
<siteinfo>
...
</siteinfo>
<page>
<title>MediaWiki:Edithelppage</title>
<ns>8</ns>
<id>21</id>
</page>
</mediawiki>
"""
import lxml.html as LH
root = LH.fromstring(wik)
for ns_tag in root.findall('page'):
for tag in ns_tag.getchildren():
print(tag.text)
輸出:
MediaWiki:Edithelppage
8
21
您可以修改它以將輸出添加到集合,列表或其他內容。
由於您只在尋找ns
元素,因此也許可以使用:
for ns_tag in root.findall('page'):
for tag in ns_tag.getchildren():
if tag.tag == 'ns':
print(tag.text)
輸出:
8
這是主意嗎?
原來它是需要的名稱空間。 此代碼有效:
from lxml import etree
def parseBookXML(xmlFile):
with open(xmlFile, encoding='UTF8') as fobj:
xml = fobj.read()
root = etree.fromstring(xml)
s = set()
for ns_tag in root.findall('{http://www.mediawiki.org/xml/export-0.10/}page'):
for tag in ns_tag.getchildren():
if tag.tag == '{http://www.mediawiki.org/xml/export-0.10/}ns':
s.add(tag.text)
print(s)
if __name__ == "__main__":
parseBookXML(r'E:\Downloads\WikipediaAF\afwiktionary-20190301-pages-articles.xml')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.