次のテスト ドキュメントに対してテストしています。
<?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 を使用してドキュメントを解析すると、xpath を使用して IMG を取得できます。
>>> 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 も、任意のドキュメントの解析には明らかに役に立ちません。
明らかに、ここでいくつかの重要な問題が欠けていますが、それが何であるかはわかりません。私の最善の推測は、名前空間と関係があるということですが、定義されている唯一の名前空間はデフォルトであり、名前空間に関して他に何を考慮する必要があるかわかりません。
それで、私は何が欠けていますか?