Почему я не получаю никаких результатов, используя lxml.etree.parse и tree.xpath в django? - PullRequest
1 голос
/ 22 марта 2012

Я пытаюсь использовать lxml.etree.parse и tree.xpath в django для анализа некоторого контента из внешнего RSS-канала. Но по какой-то причине я не могу получить никаких результатов. Ранее я мог использовать приведенный ниже метод с успехом на других XML-файлах, но, похоже, у меня возникли сложности с этим.

Вот как выглядит XML-файл, который я пытаюсь очистить:

<feed xmlns="http://www.w3.org/2005/Atom">
    <title>Open Library : Author Name</title>
    <link href="http://www.somedomain.org/people/atom/author_name" rel="self"/>
    <updated>2012-03-20T16:41:00Z</updated>
    <author>
        <name>somedomain.org</name>
    </author>
    <id>tag:somedomain.org,2007:/person_feed/123456</id>
    <entry>
        <link href="http://www.somedomain.org/roll_call/show/1234" rel="alternate"/>
        <id>
        tag:somedomain.org,2012-03-20:/roll_call_vote/1234
        </id>
        <updated>2012-03-20T16:41:00Z</updated>
        <title>Once upon a time</title>
        <content type="html">
        This os a book full of words
        </content>
    </entry>
</feed>

Вот как выглядит мой взгляд на django:

def openauthors(request):

    tree = lxml.etree.parse("http://www.somedomain.org/people/atom/author_name")
    listings = tree.xpath("//author")

    listings_info = []

    for listing in listings:
        this_value = {
            "name":listing.findtext("name"),
            }

        listings_info.append(this_value)


    json_listings = '{"listings":' + simplejson.dumps(listings_info) + '}'

    if("callback" in request.GET.keys()):
        callback = request.GET["callback"]
    else:
        callback = None

    if(callback):
        response = HttpResponse("%s(%s)" % (
                callback,
                simplejson.dumps(listings_info)
                ), mimetype="application/json"
            )
    else:
        response = HttpResponse(json_listings, mimetype="application/json")
    return response

Я также пробовал некоторые из следующих путей в надежде, что они могут помочь, но безуспешно.

    listings = tree.xpath("feed/author")
    listings = tree.xpath("/feed/author")
    listings = tree.xpath("/author")
    listings = tree.xpath("author")

Буду признателен за любую помощь в правильном направлении.

1 Ответ

0 голосов
/ 22 марта 2012

Может быть, проблема в пространствах имен. Модуль lxml добавляет имена пространств имен в начале имен тегов, поэтому, возможно, проблема в том, что выражения xpath не соответствуют этому префиксу пространства имен. Если вы перебираете элементы, просматривая имена тегов, и получаете что-то вроде этого, то это проблема:

>>> for element in tree:
...     element
[...]
<Element {http://www.w3.org/2005/Atom}author at 7f14e75d1788>
[...]

Проверьте этот префикс "{http://www.w3.org/2005/Atom}" перед тэгом" author ". Если это так, посмотрите здесь:

Нужна помощь по использованию XPath в ElementTree и здесь:

python: xml.etree.ElementTree, удаляя «пространства имен»

А также ознакомьтесь с официальной документацией, поскольку, возможно, есть опция для анализа без префиксов пространства имен.

GL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...