jestem testowania przeciwko następującym dokumencie testowym:Dlaczego xpath nie działa podczas przetwarzania dokumentu XHTML za pomocą lxml (w python)?
<?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>
Gdybym analizowania dokumentu przy użyciu lxml.html mogę uzyskać IMG z XPath dobrze:
>>> root = lxml.html.fromstring(doc)
>>> root.xpath("//img")
[<Element img at 1879e30>]
Jednak gdybym analizować dokumentu w formacie XML i postarać się znacznika IMG, dostaję pusty wynik:
>>> tree = etree.parse(StringIO(doc))
>>> tree.getroot().xpath("//img")
[]
mogę poruszać się do elementu bezpośrednio:
>>> tree.getroot().getchildren()[1].getchildren()[0]
<Element {http://www.w3.org/1999/xhtml}img at f56810>
Ale oczywiście to nie pomaga mi w przetwarzaniu dowolnych dokumentów. Chciałbym również oczekiwać, aby być w stanie kwerendy etree uzyskać wyrażenie XPath, które będą bezpośrednio zidentyfikować ten element, który technicznie mogę zrobić:
>>> tree.getpath(tree.getroot().getchildren()[1].getchildren()[0])
'/*/*[2]/*'
>>> tree.getroot().xpath('/*/*[2]/*')
[<Element {http://www.w3.org/1999/xhtml}img at fa1750>]
Ale XPath jest, ponownie, oczywiście nie przydatna do analizowania dowolnych dokumentów .
Oczywiście brakuje tu kluczowej kwestii, ale nie wiem, co to jest. Domyślam się, że ma to coś wspólnego z przestrzeniami nazw, ale jedyny zdefiniowany obszar nazw jest domyślny i nie wiem, co jeszcze muszę wziąć pod uwagę w odniesieniu do przestrzeni nazw.
Więc, czego mi brakuje?
Cytując http://codespeak.net/lxml/xpathxslt.html << Opcjonalnie można podać argument nazw słów kluczowych, które powinny być słownikiem odwzorowywania prefiksów przestrzeni nazw używanych w wyrażeniu XPath do nazw URI przestrzeni nazw >> –
Jeśli chcesz wyszukiwać za pomocą zwartych wyrażeń Xpath w domyślnej przestrzeni nazw elementu głównego, możesz użyć sztuczki działającej dla xhtml lub innych schematów, takich jak: 'nsmap = {'h': tree.getroot(). nsmap [Brak]}; elem.xpath ('// h: img', namespaces = nsmap' - ułatwia pisanie zapytania w sposób kompaktowy. – mkj