Использование lxml для проверки HTML

Я пытаюсь использовать lxml для проверки фрагмента HTML, но он жалуется, что фрагмент недействителен, хотя он должен быть действительным:

img = """<img src="http://api.com/?data=ey&ip=1&img=1" height="1" width="1">"""
parser = lxml.etree.HTMLParser(recover=False)
lxml.etree.parse(StringIO(img), parser)

поднимает:

XMLSyntaxError: htmlParseEntityRef: expecting ';', line 1, column 37

Изменение &, разделяющего части строки запроса, на ;, по-видимому, устраняет проблему, но этого не требуется. Использование точек с запятой является рекомендацией W3C.

Есть ли что-то, что я могу сделать, чтобы lxml увидел этот фрагмент как действительный?


person Alex Rothberg    schedule 27.03.2015    source источник


Ответы (1)


Я не могу проверить это с помощью lxml, но я предполагаю, что вам нужно экранировать амперсанд как &amp;:

<img src="http://api.com/?data=ey&amp;ip=1&amp;img=1" height="1" width="1">
person unor    schedule 27.03.2015
comment
На самом деле я думаю, что lxml требует согласно рекомендации W3C, это <img src="http://api.com/?data=ey;ip=1;img=1" height="1" width="1">. - person Alex Rothberg; 27.03.2015
comment
@AlexRothberg: Почему это должно быть так? Нет рекомендации W3C, требующей ; в URI. Вы можете создавать свои URI в соответствии с стандартом URI. Фактически, по умолчанию HTML-формы GET используют & для разделения пар "имя-значение" в компоненте запроса. Ваш пример URI в порядке; вам просто нужно экранировать &, если он используется в атрибутах HTML, таких как href. - person unor; 28.03.2015