Поставщик предоставляет мне xml данные, которые содержат ключевые спецификации продукта, а также блок HTML, который содержит форматированное описание продукта.
Для каждого продукта в XML, который мне нужен чтобы извлечь три вещи:
-
ProductNumber
, закодированный в <article..>
- Текст HTML, найденный в
<description> ... </description>
. Мне нужно это как строка. Он будет загружен в API веб-сайта с запросом REST. - Каждая из (ноль или более)
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ähmachinen</p>
<p><strong>Eigenschaften:</strong></p>
<ul>
<li>23 Nähprogramme (6 Nutzstiche, 5 Stretchstiche und 11 Schmuckstiche)</li>
<li>vollautomatisches Knopfloch</li>
<li>automatischer Nadeleinfädler</li>
<li>variable Stichlänge</li>
<li>Nähfußwechsel in Sekunden</li>
<li>Rückwärtsnähen</li>
<li>Umfangreiches Zubehö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
Для данных описания мне просто нужно содержимое в виде строки как есть; его не нужно декодировать (я полагаю, это то, что пытается сделать парсер). Есть ли способ сделать это?