1

以下のコードを使用して、Alexa API から情報を取得しています。このコードは Python 2.7 ではうまく機能しますが、Python 2.6 を使用する必要があり、エラーが発生します

このメソッドは Python 2.7 で変更されたと思いますが、2.6 で機能させる方法がわかりません。

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 tree.findall('//awis:SitesLinkingIn/awis:Site',NS_PREFIXES):
    alexa_sites_linkin_in.update({
    element.find('awis:Title', NS_PREFIXES).text: element.find('awis:Url', "awis").text})

助けてくれてありがとう。

4

2 に答える 2

1

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ください。

于 2015-01-11T04:44:17.347 に答える