Мне нужен способ использовать парсер html5lib для создания реального xml.etree.ElementTree. (lxml не подходит из соображений переносимости.)
ELementTree.parse
может использовать парсер как необязательный параметр
xml.etree.ElementTree.parse(source, parser=None)
но не ясно, как будет выглядеть такой парсер. Есть ли класс или объект в HTML5, который я мог бы использовать для аргумента parser
? Документации для обеих библиотек по этому вопросу мало.
Контекст:
У меня есть искаженный файл XHTML, который не может быть проанализирован с помощью ElementTree.parse
:
<?xml version="1.0" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Title</title></head>
<body><div class="cls">Note that this br<br>is missing a closing slash</div></body>
</html>
Поэтому я использовал html5lib.parse
вместо параметра по умолчанию treebuilder="etree"
, который работал нормально.
Но html5lib, по-видимому, не выводит объект xml.etree.ElementTree
, а только объект с почти идентичным API. С этим есть две проблемы:
find
html5lib не поддерживает параметрnamespaces
, что делает XPath чрезмерно многословным без неуклюжего функция-оболочка.- Отладчик Eclipse не поддерживает детализацию деревьев html5lib.
Поэтому я не могу использовать ни ElementTree, ни html5lib по отдельности.