Я тестирую по следующему документу:
<?xml version="1.0" encoding="UTF-8"?>
<!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>
<title>hi there</title>
</head>
<body>
<img class="foo" src="bar.png"/>
</body>
</html>
Если я проанализирую документ с помощью lxml.html, я смогу получить IMG с xpath просто отлично:
>>> root = lxml.html.fromstring(doc)
>>> root.xpath("//img")
[<Element img at 1879e30>]
Однако, если я проанализирую документ как XML и попытаюсь получить тег IMG, я получу пустой результат:
>>> tree = etree.parse(StringIO(doc))
>>> tree.getroot().xpath("//img")
[]
Я могу перейти к элементу напрямую:
>>> tree.getroot().getchildren()[1].getchildren()[0]
<Element {http://www.w3.org/1999/xhtml}img at f56810>
Но, конечно, это не помогает мне обрабатывать произвольные документы. Я также ожидал, что смогу запросить etree, чтобы получить выражение xpath, которое будет напрямую идентифицировать этот элемент, что, технически, я могу сделать:
>>> tree.getpath(tree.getroot().getchildren()[1].getchildren()[0])
'/*/*[2]/*'
>>> tree.getroot().xpath('/*/*[2]/*')
[<Element {http://www.w3.org/1999/xhtml}img at fa1750>]
Но этот xpath, опять же, явно бесполезен для разбора произвольных документов.
Очевидно, я упускаю какую-то ключевую проблему здесь, но я не знаю, что это такое. Мое лучшее предположение состоит в том, что это как-то связано с пространствами имен, но единственное определенное пространство имен - это значение по умолчанию, и я не знаю, что еще мне нужно учитывать в отношении пространств имен.
Итак, что мне не хватает?