I’m using etree to parse an external xml file and trying to get the listing data from a tree from the below external xml file and add the subtree agancy data to it. I am able to pull the data for isting and agancy just fine seperately, but don’t know how to merge them so that the listing gets the correct agency info.
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>
python:
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)
I tried adding this at one point just above where the listing_info.append(this_value) occurs, however this is not correct and just appends the last agency value to every listing.
I’m outputting the data into json and here’s what it looks like (You can see how one agency’s info is being put into both results:
{"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"} ]}
How can I merge the data from response/listing/agency with response/listing in my original for statement?
You can use
listing.xpath('agency/name/text()')[0]as you iterate through your list to get the agency’s name for just that listing.