Как я могу использовать XPATH для добавления данных поддерева в главное дерево в Python / Django - PullRequest
1 голос
/ 23 сентября 2011

Я использую etree для анализа внешнего xml-файла и пытаюсь получить listing data из дерева из приведенного ниже внешнего xml-файла и добавить в него данные поддерева agancy. Я могу получить данные для isting и agancy просто отлично, но не знаю, как их объединить, чтобы listing получил правильную agency информацию.

xml:

<response>
    <listing>
        <bathrooms>2.1</bathrooms>
        <bedrooms>3</bedrooms>
        <agency>
            <name>Bob's Realty</name>
            <phone>555-693-4356</phone>
        </agency>
    </listing>
    <listing>
        <bathrooms>3.1</bathrooms>
        <bedrooms>5</bedrooms>
        <agency>
            <name>Larry's Homes</name>
            <phone>555-324-6532</phone>
        </agency>
    </listing>
</response>

питон:

tree = lxml.etree.parse("http://www.someurl.com?random=blahblahblah")
listings = tree.xpath("/response/listing")
agencies = tree.xpath("/response/listing/agency")

listings_info = []

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

        for agency in agencies:
            this_value['agency']= agency.findtext("name")


    listings_info.append(this_value)

Я попытался добавить это в один момент чуть выше, где встречается listing_info.append(this_value), однако это неверно и просто добавляет последнее значение агентства в каждый список.

Я выводю данные в json, и вот как это выглядит (Вы можете видеть, как информация одного агентства вкладывается в оба результата:

    {"listings":[{"agency": "Bob's Realty", "phone":"555-693-4356" "bathrooms": "2.1", "bedrooms": "3"},{"agency": "Bob's Realty", "phone":"555-693-4356" "bathrooms": "3.1", "bedrooms": "5"} ]}

Как я могу объединить данные из response/listing/agency с response/listing в моем исходном for утверждении?

1 Ответ

1 голос
/ 23 сентября 2011

Вы можете использовать listing.xpath('agency/name/text()')[0] при просмотре списка, чтобы получить название агентства только для этого списка.

for listing in listings:
    this_value = {
        'bedrooms': listing.findtext('bedrooms'),
        'bathrooms': listing.findtext('bathrooms'),
        'agency': listing.xpath('agency/name/text()')[0]
    }
    listings_info.append(this_value)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...