Синтаксический анализ XML, который содержит HTML символьные объекты - PullRequest
0 голосов
/ 03 марта 2020

Поставщик предоставляет мне xml данные, которые содержат ключевые спецификации продукта, а также блок HTML, который содержит форматированное описание продукта.

Для каждого продукта в XML, который мне нужен чтобы извлечь три вещи:

  1. ProductNumber, закодированный в <article..>
  2. Текст HTML, найденный в <description> ... </description>. Мне нужно это как строка. Он будет загружен в API веб-сайта с запросом REST.
  3. Каждая из (ноль или более) tecdat записей в виде списка или словаря

Вот пример о том, как я сейчас пытаюсь сделать это:

xml_text="""<?xml version="1.0" encoding="ISO-8859-1"?>
<articlelist xml:lang="DE">
    <articlegroup id="ABC">
        <article ProductNumber="12345" ProductGroup="ABC" ProductGroupName="Nähmaschinen" SetArtikel="0">
            <name>Nähmaschine</name>
            <description><p>Ich verkaufe N&auml;hmachinen</p>
                <p><strong>Eigenschaften:</strong></p>
                <ul>
                    <li>23 N&auml;hprogramme (6 Nutzstiche, 5 Stretchstiche und 11 Schmuckstiche)</li>
                    <li>vollautomatisches Knopfloch</li>
                    <li>automatischer Nadeleinf&auml;dler</li>
                    <li>variable Stichl&auml;nge</li>
                    <li>N&auml;hfu&szlig;wechsel in Sekunden</li>
                    <li>R&uuml;ckw&auml;rtsn&auml;hen</li>
                    <li>Umfangreiches Zubeh&ouml;r griffbereit im Anschiebetisch</li>
                </ul>
            </description>
            <tecdat>
                <group name="Type">
                    <property name="Product Type">Nähmaschine</property>
                </group>
            </tecdat>
            <tecdat>
                <group name="Function">
                    <property name="Programs">12</property>
                    <property name="Watt">85</property>
                </group>
            </tecdat>
        </article>
    </articlegroup>
</articlelist>
"""
with open("example.xml", "w") as f:
    f.write(xml_text)

import xml.etree.ElementTree as ET

tree = ET.parse("example.xml")

Символьные объекты HTML (в данном случае немецкие специальные символы) вызывают проблемы с анализатором, что приводит к следующей ошибке:

Traceback (most recent call last):

  File "/opt/conda/lib/python3.7/site-packages/IPython/core/interactiveshell.py", line 3326, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)

  File "<ipython-input-17-432571b020ae>", line 1, in <module>
    tree = ET.parse("example.xml")

  File "/opt/conda/lib/python3.7/xml/etree/ElementTree.py", line 1197, in parse
    tree.parse(source, parser)

  File "/opt/conda/lib/python3.7/xml/etree/ElementTree.py", line 598, in parse
    self._root = parser._parse_whole(source)

  File "<string>", line unknown
ParseError: undefined entity: line 6, column 42

Для данных описания мне просто нужно содержимое в виде строки как есть; его не нужно декодировать (я полагаю, это то, что пытается сделать парсер). Есть ли способ сделать это?

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