Извлечение XML данных с использованием Python - PullRequest
0 голосов
/ 20 апреля 2020

Я пытаюсь создать файл JSON, содержащий извлеченные данные из файла Goodreads XML, но я не могу этого сделать. Я никогда не работал с XML и пытался go с помощью учебных пособий, но безрезультатно, я не могу извлечь какие-либо данные.

Мой XML Файл выглядит так:

  <books_count type="integer">11</books_count>
  <original_publication_year type="integer">1997</original_publication_year>
  <original_publication_month type="integer" nil="true"/>
  <original_publication_day type="integer" nil="true"/>
  <original_title>There Was an Old Lady Who Swallowed a Fly</original_title>
<popular_shelves>
      <shelf name="to-read" count="3504"/>
      <shelf name="picture-books" count="397"/>
      <shelf name="childrens" count="226"/>
      <shelf name="children-s-books" count="213"/>
      <shelf name="children" count="149"/>
      <shelf name="children-s" count="139"/>
      <shelf name="caldecott" count="110"/>
</pouplar_shelves>

Как извлечь данные и, в частности, из популярных полок, поскольку данные, которые мне нужны, указаны в названии полки?

Edit1:

import os
from xml.etree import ElementTree as ET
path = "books_xml"
for filename in os.listdir(path):
    if not filename.endswith('.xml'): continue
    fullname = os.path.join(path, filename)
    tree = ET.parse(fullname)
    print(tree)
    root = tree.getroot()
    for child in root:
        print(child.books_count, child.text)

Это то, что я пытался Я должен запустить несколько xml файлов в каталоге. Выдает ошибку:

AttributeError: 'xml.etree.ElementTree.Element' object has no attribute 'books_count'

Edit2:

import os
from xml.etree import ElementTree as ET

mytree = ET.parse('sample_book.xml')
myroot = mytree.getroot()
print(myroot)
name = myroot.find('original_title').text
print(name)

Дает следующую ошибку

AttributeError: 'NoneType' object has no attribute 'text'

1 Ответ

3 голосов
/ 20 апреля 2020

Во-первых, здесь вы найдете все примеры для базового c извлечения

https://docs.python.org/3/library/xml.etree.elementtree.html#tutorial

2-й, ваши xml должны быть лучше структурированы: например "pouplar_shelves" - это ошибка опечатки

3-й, я приведу небольшой пример

import xml.etree.ElementTree as ET

xml = '''
<popular_shelves>
      <shelf name="to-read" count="3504"/>
      <shelf name="picture-books" count="397"/>
      <shelf name="childrens" count="226"/>
      <shelf name="children-s-books" count="213"/>
      <shelf name="children" count="149"/>
      <shelf name="children-s" count="139"/>
      <shelf name="caldecott" count="110"/>
</popular_shelves>
'''

xml_root = ET.fromstring(xml)

for i in xml_root.iter():
    print(i.tag, i.attrib)

В результате:

popular_shelves {}
shelf {'name': 'to-read', 'count': '3504'}
shelf {'name': 'picture-books', 'count': '397'}
shelf {'name': 'childrens', 'count': '226'}
shelf {'name': 'children-s-books', 'count': '213'}
shelf {'name': 'children', 'count': '149'}
shelf {'name': 'children-s', 'count': '139'}
shelf {'name': 'caldecott', 'count': '110'}
Press any key to continue . . .

Редактировать:

Вы должны лучше понять, что я послал в документах Python. Кроме того, ознакомьтесь с исходным кодом ET

https://github.com/python/cpython/blob/3.8/Lib/xml/etree/ElementTree.py

Это модель

Example form:
        <tag attrib>text<child/>...</tag>tail

Используя полку в качестве примера:

for i in xml_root.iter('shelf'):
    print(i.attrib)

Вернет это:

{'name': 'to-read', 'count': '3504'}
{'name': 'picture-books', 'count': '397'}
{'name': 'childrens', 'count': '226'}
{'name': 'children-s-books', 'count': '213'}
{'name': 'children', 'count': '149'}
{'name': 'children-s', 'count': '139'}
{'name': 'caldecott', 'count': '110'}

Bcz Ваш тег XML находится на полке, а ваши атрибуты - это имя, а количество - переведенный текст ... tail

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...