Python 2.6 (およびそれ以前) では、手動で名前空間を登録し、それをクラーク表記に解決してから、 forfind()
がそれらを認識できるようにする必要があります。
最初に、http : //effbot.org/zone/element-namespaces.htm で説明されているように名前空間を登録します。
from xml import ElementTree
try:
register_namespace = ElementTree.register_namespace
except AttributeError:
def register_namespace(prefix, uri):
ElementTree._namespace_map[uri] = prefix
for short_name, url in NS_PREFIXES.items():
register_namespace(short_name, url)
次に、名前空間付きの XPath を自分でクラーク表記に解決する必要があります。これfind()
は内部で使用されます。たとえば、次のようにawis:Title
解決され{http://awis.amazonaws.com/doc/2005-07-11}Title
ます。
def resolved_xpath(xpath, namespace):
result = xpath
for short_name, url in namespace.items():
result = re.sub(r'\b' + short_name + ':', '{' + url + '}', result)
return result
今ではPython 2.6 でも名前空間を尊重する変更find()
された を書くのは簡単です:findall()
def find_with_namespace(element, xpath, namespace):
return element.find(resolved_xpath(xpath, namespace))
def findall_with_namespace(element, xpath, namespace):
return element.findall(resolved_xpath(xpath, namespace))
あなたの例は次のように実装できます。
NS_PREFIXES = {
"alexa": "http://alexa.amazonaws.com/doc/2005-10-05/",
"awis": "http://awis.amazonaws.com/doc/2005-07-11",
}
tree = api.sites_linking_in(domain + ".eu", count=10, start=0)
alexa_sites_linkin_in = {}
for element in findall_with_namespace(tree, '//awis:SitesLinkingIn/awis:Site',NS_PREFIXES):
title = find_with_namespace(element, 'awis:Title', NS_PREFIXES).text
url = find_with_namespace(element, 'awis:Url', NS_PREFIXES).text
alexa_sites_linkin_in[title] = url
はい、可能であれば、使用してlxml
ください。