2015-07-06 4 views
1

Я хочу проанализировать атрибуты кодов стран в RankByCountry. Как мне это сделать?Анализ атрибутов XML с вложенными пространствами имен с помощью lxml

нуждаемости напечатать список [ 'GB', 'США', 'O']

<aws:UrlInfoResponse xmlns:aws="http://alexa.amazonaws.com/doc/2005-10-05/"><aws:Response xmlns:aws="http://awis.amazonaws.com/doc/2005-07-11"><aws:OperationRequest><aws:RequestId>122bfdc6-ae8e-d2a2-580e-3841ab33b966</aws:RequestId></aws:OperationRequest><aws:UrlInfoResult><aws:Alexa> 
<aws:TrafficData> 
    <aws:DataUrl type="canonical">androidjones.com/</aws:DataUrl> 
    <aws:RankByCountry> 
    <aws:Country Code="GB"> 
     <aws:Rank>80725</aws:Rank> 
     <aws:Contribution> 
     <aws:PageViews>30.6%</aws:PageViews> 
     <aws:Users>41.3%</aws:Users> 
     </aws:Contribution> 
    </aws:Country> 
    <aws:Country Code="US"> 
     <aws:Rank>354356</aws:Rank> 
     <aws:Contribution> 
     <aws:PageViews>39.1%</aws:PageViews> 
     <aws:Users>28.9%</aws:Users> 
     </aws:Contribution> 
    </aws:Country> 
    <aws:Country Code="O"> 
     <aws:Rank/> 
     <aws:Contribution> 
     <aws:PageViews>30.2%</aws:PageViews> 
     <aws:Users>29.8%</aws:Users> 
     </aws:Contribution> 
    </aws:Country> 
    </aws:RankByCountry> 
</aws:TrafficData> 
</aws:Alexa></aws:UrlInfoResult><aws:ResponseStatus xmlns:aws="http://alexa.amazonaws.com/doc/2005-10-05/"><aws:StatusCode>Success</aws:StatusCode></aws:ResponseStatus></aws:Response></aws:UrlInfoResponse> 

уже tried--

namespaces = {"aws": "http://awis.amazonaws.com/doc/2005-07-11"} 
RankByCountry = tree.xpath("//aws:Country/Code", namespaces=namespaces) 

, но не повезло.

, а также:

for country in tree.xpath('//Country'): 
    for attrib in country.attrib: 
     print '@' + attrib + '=' + country.attrib[attrib] 
+1

Вы что-то пробовали? –

+0

да, но не знаю, как получить доступ к атрибуту, просто данные ... – Yaeli778

+0

@ KhalilAmmour- خليلعمور - Я редактировал вопрос. – Yaeli778

ответ

3

документ выглядит странно, так как он использует префикс пространства имен aws дважды. Вам нужно использовать более конкретное пространство имен, поскольку это перезаписывает глобальное пространство имен префиксом aws. На самом деле вы делаете это правильно.

Проблема является выражением XPath сам, она должна выглядеть следующим образом:

for country in tree.xpath('//aws:RankByCountry/aws:Country/@Code', namespaces=namespaces): 
    print(country) 

Обратите внимание, что <aws:RankByCountry> не имеет Code атрибута, но <aws:Country> имеет.

+1

Спасибо @ hek2mgl. вы можете изменить 'root' на' tree', чтобы он соответствовал моему коду. – Yaeli778

 Смежные вопросы

  • Нет связанных вопросов^_^