Разбор неполного xml, поддержание заглавных букв - PullRequest
0 голосов
/ 30 декабря 2018

У меня есть фрагмент XML, который мне нужно проанализировать.Вот два способа, которые я попытался проанализировать с помощью lxml:

s='''<Persons>
    <Person>
            <FirstName>Mark</FirstName>
            <LastName>Tom</LastName>
    </Person>
    <Person>
            <FirstName>Mark</FirstName>'''

>>> etree.fromstring(s)
lxml.etree.XMLSyntaxError: Premature end of data in tag Person line 6, line 7, column 30

>>> html.fromstring(s)
<Element persons at 0x11fc49908>

Однако мне нужно сохранить чувствительность к регистру тегов - я не могу поместить их все в нижний регистр как html делает: однако, использование etree не удается, поэтому я вынужден использовать парсер html.

Как мне сохранить правильную заглавную букву в вышеуказанном вопросе?Тэг должен быть Persons, а не persons.

Я бы хотел остаться в пределах lxml, но пока единственное решение, которое я нашел, это использование BeautifulSoup:

>>> from bs4 import BeautifulSoup as bs4
>>> bs4(s, 'xml')
<Persons>
...

1 Ответ

0 голосов
/ 30 декабря 2018

Вы все еще могли бы подойти к этому с lxml, установив режим восстановления на:

recover - изо всех сил пытаться разобрать сломанный XML

parser = etree.XMLParser(recover=True)
root = etree.fromstring(s, parser=parser)

Демонстрация:

In [2]: parser = etree.XMLParser(recover=True)

In [3]: root = etree.fromstring(s, parser=parser)

In [4]: root
Out[4]: <Element Persons at 0x10aba9e18>
...