python amazon-web-services lxml xml.etree

Resultado de python alexa con lxml.etree



amazon-web-services (1)

Estoy usando alexa api de aws, pero me resulta difícil analizar el resultado para obtener lo que quiero

alexa api devuelve un árbol de objetos <type ''lxml.etree._ElementTree''>

Yo uso este código para imprimir el árbol

from lxml import etree root = tree.getroot() print etree.tostring(root)

Obtengo xml a continuación

<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>ccf3f263-ab76-ab63-db99-244666044e85</aws:RequestId></aws:OperationRequest><aws:UrlInfoResult><aws:Alexa> <aws:ContentData> <aws:DataUrl type="canonical">google.com/</aws:DataUrl> <aws:SiteData> <aws:Title>Google</aws:Title> <aws:Description>Enables users to search the world''s information, including webpages, images, and videos. Offers unique features and search technology.</aws:Description> <aws:OnlineSince>15-Sep-1997</aws:OnlineSince> </aws:SiteData> <aws:LinksInCount>3453627</aws:LinksInCount> </aws:ContentData> <aws:TrafficData> <aws:DataUrl type="canonical">google.com/</aws:DataUrl> <aws:Rank>1</aws:Rank> </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>

Uso el texto root.find(''LinksInCount'').text Para obtener el valor del elemento pero no funciona.

Quiero saber cómo obtener el texto 3453627 de aws:LinksInCount


Te encuentras con dos desafíos:

  • XML utilizando espacios de nombres
  • dos espacios de nombres que comparten el mismo prefijo de espacio de nombres

Documento XML con prefijo reutilizado para 2 espacios de nombres diferentes

Verá el prefijo "aws:" , pero se usa para dos espacios de nombres diferentes:

xmlns:aws="http://alexa.amazonaws.com/doc/2005-10-05/" xmlns:aws="http://awis.amazonaws.com/doc/2005-07-11"

Usar el mismo prefijo de espacio de nombres en XML es completamente legal. La regla es, la última es válida.

xmlstr = """ <?xml version="1.0"?> <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>ccf3f263-ab76-ab63-db99-244666044e85</aws:RequestId> </aws:OperationRequest> <aws:UrlInfoResult> <aws:Alexa> <aws:ContentData> <aws:DataUrl type="canonical">google.com/</aws:DataUrl> <aws:SiteData> <aws:Title>Google</aws:Title> <aws:Description>Enables users to search the world''s information, including webpages, images, and videos. Offers unique features and search technology.</aws:Description> <aws:OnlineSince>15-Sep-1997</aws:OnlineSince> </aws:SiteData> <aws:LinksInCount>3453627</aws:LinksInCount> </aws:ContentData> <aws:TrafficData> <aws:DataUrl type="canonical">google.com/</aws:DataUrl> <aws:Rank>1</aws:Rank> </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> """

El siguiente desafío es cómo buscar elementos de espacio de nombres.

Prefiero usar xpath , y para ello, puedes usar cualquier espacio de nombres que quieras en la expresión xpath, pero tienes que decirle a la llamada xpath lo que quieres decir con esos prefijos. Esto se hace por diccionario de namespaces de namespaces :

from lxml import etree doc = etree.fromstring(xmlstr.strip()) namespaces = {"aws": "http://awis.amazonaws.com/doc/2005-07-11"} texts = doc.xpath("//aws:LinksInCount/text()", namespaces=namespaces) print texts[0]