Python XML 子标记值的唯一列表

2024-05-19 01:44:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写我的第一个pythonxml查询,但没有成功。我有以下代码:

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>标记之间提取一个不同的值列表,但是集合s返回为空,也没有打印任何内容。你知道吗

有人知道我哪里出错了吗?你知道吗


Tags: keytextorgidtagpagerootxml
2条回答

原来它需要名称空间。此代码有效:

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

如果我正确理解你的问题,让我们试试这个方法(与你的方法有些不同,但我更习惯于……):

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

是这个主意吗?你知道吗

相关问题 更多 >

    热门问题