Ответ 1
Вам нужно выполнить iter() над вашим корнем.
то есть root.iter()
сделает свое дело!
import xml.etree.ElementTree as ET
import urllib2
tree =ET.parse(urllib2.urlopen('http://ratings.food.gov.uk/OpenDataFiles/FHRS408en-GB.xml'))
root = tree.getroot()
for child in root.iter():
print child.tag, child.attrib
Выход:
FHRSEstablishment {}
Header {}
ExtractDate {}
ItemCount {}
ReturnCode {}
EstablishmentCollection {}
EstablishmentDetail {}
FHRSID {}
LocalAuthorityBusinessID {}
...
- Чтобы получить все теги внутри
EstablishmentDetail
, вам нужно найти этот тег, а затем просмотреть его дочерние элементы!
То есть, например.
for child in root.find('.//EstablishmentDetail'):
print child.tag, child.attrib
Выход:
FHRSID {}
LocalAuthorityBusinessID {}
BusinessName {}
BusinessType {}
BusinessTypeID {}
RatingValue {}
RatingKey {}
RatingDate {}
LocalAuthorityCode {}
LocalAuthorityName {}
LocalAuthorityWebSite {}
LocalAuthorityEmailAddress {}
Scores {}
SchemeType {}
NewRatingPending {}
Geocode {}
- Чтобы получить оценку для
Hygiene
, как вы упомянули в комментарии,
Что вы сделали, так это то, что при вызове for each in root.find('.//Scores'):rating=child.get('Hygiene')
он получит первый тег Scores
и будет иметь теги Hygiene, ConfidenceInManagement, Structural как дочерний. То есть очевидно, что все три ребенка не будут иметь элемент!
Вы должны сначала
- найти все теги Scores
.
- найти Hygiene
в каждом найденном теге!
for each in root.findall('.//Scores'):
rating = each.find('.//Hygiene')
print '' if rating is None else rating.text
Выход:
5
5
5
0
5