Escape HTML сущностей, которые не XML - PullRequest
0 голосов
/ 15 января 2020

Я анализирую файл XML, созданный приложением для резервного копирования SMS, но некоторые вещи экранируются сущностями HTML. Я использую xml.etree.ElementTree, но он жалуется на xml.etree.ElementTree.ParseError: reference to invalid character number: line 29, column 308, что совпадает с ��
 в файле XML. Я знаю, что могу использовать BeautifulSoup. На самом деле, у меня уже есть работающая программа, которая использует его, но я пытаюсь переписать его, чтобы ускорить его. Вот пример тега:

<sms protocol="0" address="1012223434" date="1548857971596" type="1" subject="null" body="... by the time you want a ride. &#55357;&#56841;&#10;" toa="null" sc_toa="null" service_center="null" read="1" status="-1" locked="0" date_sent="0" readable_date="Jan 30, 2019 9:19:31 AM" contact_name="Mom" />

Я использовал iterparse для данных, чтобы не потреблять слишком много памяти, но я также попытался просто использовать parse и очистить каждый элемент когда я закончу, чтобы у меня был лучший контроль, но я на самом деле не смог понять эту одну часть. Если я использую html.unescape, это слишком много, и я получаю xml.etree.ElementTree.ParseError: not well-formed (invalid token): line 27, column 175, где было &apos; до того, как оно не было убрано. Если я попытаюсь поставить xml.sax.saxutils.escape поверх неэкранированного HTML, то это, конечно, также ускользает от всего, что на самом деле должно быть частью XML.

Как я могу скрыть HTML сущности, не заходящие слишком далеко и не покидающие все XML сущности?

Ответы [ 2 ]

0 голосов
/ 16 января 2020

Эта библиотека может обрабатывать HTML и XML, с высокой отказоустойчивостью

from simplified_scrapy.simplified_doc import SimplifiedDoc
html='''<sms protocol="0" address="1012223434" date="1548857971596" type="1" subject="null" body="... by the time you want a ride. &#55357;&#56841;&#10;" toa="null" sc_toa="null" service_center="null" read="1" status="-1" locked="0" date_sent="0" readable_date="Jan 30, 2019 9:19:31 AM" contact_name="Mom" />'''
doc = SimplifiedDoc(html).getElementByTag('sms')
print (doc)

Результат:

{'tag': 'sms', 'protocol': '0', 'address': '1012223434', 'date': '1548857971596', 'type': '1', 'subject': 'null', 'body': '... by the time you want a ride. &#55357;&#56841;&#10;', 'toa': 'null', 'sc_toa': 'null', 'service_center': 'null', 'read': '1', 'status': '-1', 'locked': '0', 'date_sent': '0', 'readable_date': 'Jan 30, 2019 9:19:31 AM', 'contact_name': 'Mom'}

Вы можете получить примеры SimplifiedDo c здесь

0 голосов
/ 16 января 2020

XML Допустимые символы

В соответствии с W3 C XML Рекомендация

[2] Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]

Обозначение

  • &# d ; Обозначение означает, что d является десятичным представлением кодовой точки символа.

  • &#x d ; Обозначение означает, что d является шестнадцатеричным представлением кодовой точки символа.

Анализ ошибок

  • &#55357; равен &#xD83D;, что не является допустимым символом в XML.

  • &#56841; равно &#xDE09;, что также не является допустимым символом в XML.

Поэтому ваше вступительное заявление,

Я анализирую XML файл

неверен, и вы не можете использовать совместимый синтаксический анализатор XML для анализа этих данных . Вместо этого вы вынуждены использовать методы на Как анализировать недопустимые (плохие / не правильно сформированные) XML?

Рекомендация № 1 существует для устранения проблемы на происхождение. (Подсказка: в UTF- 16 , 55,357 56,842 - это ?, так что рассмотрите проблемы с кодированием.) Если исправить происхождение невозможно, приведенная выше ссылка предлагает множество других альтернатив для работы с Неверное "XML" на многих языках программирования, включая Python.

См. также

...