ElementTree, похоже, не получает некоторые тексты/элементы в дереве

У меня есть дамп википедии, который я хочу проанализировать, и у меня возникают некоторые трудности/загадочные проблемы при использовании синтаксического анализатора Python xml, ElementTree.

Моя недавняя проблема заключается в том, что ElementTree, похоже, не находит тексты, которые на самом деле есть. Это пример данных:

<page>
    <title>Cengiz Han</title>
    <ns>0</ns>
    <id>10</id>
    <revision>
      <id>20337884</id>
      <parentid>20218916</parentid>
      <timestamp>2019-01-29T14:02:43Z</timestamp>
      <contributor>
        <username>CommonsDelinker</username>
        <id>31545</id>
      </contributor>
      <comment>China_11b.jpg dosyası Map_of_China_1142.jpg ile değiştirildi</comment>
      <model>wikitext</model>
      <format>text/x-wiki</format>
      <text xml:space = "preserve">
         ...some long Genghis Khan stuff...
      </text>
</page>

Теперь, когда я разбираю это с этим:

for event, elem in et.iterparse('dataset/wiki_test', events=('start', 'end', 'start-ns', 'end-ns')):
    if event == 'start':
        if elem.tag == 'page':
            if len(list(elem)) == 0:
                continue
            title = elem.find('title').text
            if title == None or 'MediaWiki' in title:
                elem.clear()
                continue
            wiki_id = elem.find('id')
            if wiki_id == None:
                elem.clear()
                continue
            wiki_id = wiki_id.text
            revision = elem.find('revision')
            if revision != None:
                print(list(revision))
                text = revision.find('text').text
                print(text)
                if text != None:
                    count += 1
                    titles += title + '\n'
                    page = {'wiki_id': wiki_id, 'title': title, 'text': text.text}
                    pages += json.dumps(page, ensure_ascii=False) + '\n'
        elem.clear()

revision.find('text').text строка, кажется, не находит текста для элементов немного, включая приведенный выше, и некоторые из них составляют примерно одну седьмую часть моих данных, что раздражает. Это также имело место для page->id для некоторых других записей, в которых утверждалось, что этот элемент вообще не существует. Я решил эту проблему, проигнорировав эти, но я действительно не хочу этого делать, и эта ошибка вообще не имеет для меня смысла.

Вот еще одна страница, которая отлично работает.

<page>
    <title>Mustafa Suphi</title>
    <ns>0</ns>
    <id>22</id>
    <revision>
      <id>20077185</id>
      <parentid>20017115</parentid>
      <timestamp>2018-10-14T08:31:32Z</timestamp>
      <contributor>
        <username>Vikiçizer</username>
        <id>90501</id>
      </contributor>
      <comment>/* top */düzeltme  [[Vikipedi:AWB|AWB]] ile</comment>
      <model>wikitext</model>
      <format>text/x-wiki</format>
      <text xml:space = "preserve">
          ...some Mustafa Suphi stuff...
      </text>
      <sha1>m5finh6h2kr8h2fbtmsatp5fhz1siwq</sha1>
    </revision>
  </page>

Что я делаю неправильно?

event == 'start' не гарантирует, что присутствует весь Элемент. Изменить на event == 'stop'
stovfl 07.03.2019 18:21

Не могли бы вы загрузить полный XML и объяснить, какую структуру данных вы хотите извлечь из этого XML?

balderman 09.03.2019 17:13
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
46
1

Ответы 1

Вы разместили два примера: "работает" и "не работает".

В "нерабочей" нет

</revision>

Вы уверены, что это XML, который у вас есть, или это просто ошибка копирования и вставки.

Ошибка копирования-вставки.

Burak Özmen 09.03.2019 17:08

Другие вопросы по теме