python Alexa结果解析与lxml.etree

标签 python amazon-web-services lxml xml.etree

我正在使用 aws 的 Alexa api,但我发现很难解析结果以获得我想要的内容

alexa api 返回一个对象树 <type 'lxml.etree._ElementTree'>

我使用此代码来打印树

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

我得到下面的 xml

<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>

我使用root.find('LinksInCount').text获取元素的值但它不起作用。

我想知道如何获取文本3453627aws:LinksInCount

最佳答案

您遇到两个挑战:

  • 使用命名空间的 XML
  • 两个命名空间共享相同的命名空间前缀

具有 2 个不同命名空间重用前缀的 XML 文档

您会看到 "aws:" 前缀,但它用于两个不同的命名空间:

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

在 XML 中使用相同的命名空间前缀是完全合法的。规则是,后一个有效。

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>
"""

下一个挑战是如何搜索命名空间元素。

我更喜欢使用 xpath,为此,您可以在 xpath 表达式中使用您喜欢的任何命名空间,但您必须告诉 xpath 调用您的意思那些前缀。这是通过 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]

关于python Alexa结果解析与lxml.etree,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24382718/

相关文章:

python - 避免在 Beam Python SDK 中重新计算所有云存储文件的大小

c# - 如何获取 outlook 用户列表的忙/闲状态(以及如何获取用户列表)?

node.js - 使用 chef 在 aws 上安装 node.js 的正确方法

python - 字符串变量作为 lxml.builder 中的 href

python - 自定义元素类查找未加载自定义元素

python - 随机数生成 python 3.x 默认库

python - 使用 Python 解析 IFF 样式数据

amazon-web-services - Certbot 更新错误 - AWS EC2

javascript - Cognito 不会将未经身份验证的用户切换为经过身份验证的用户

python - openshift:无法为 python 应用程序安装 lxml