使用 lxml 解析具有嵌套命名空间的 XML 属性
Parsing XML attributes with nested namespaces with lxml
我想解析 RankByCountry 中的国家代码属性。我该怎么做?
表示-打印列表['GB'、'US'、'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>
已经试过了--
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]
该文档看起来很奇怪,因为它使用了两次 aws
命名空间前缀。您需要使用更具体的命名空间,因为这会覆盖前缀为 aws
的全局命名空间。其实你这样做是对的。
问题出在 xpath 表达式本身,它应该如下所示:
for country in tree.xpath('//aws:RankByCountry/aws:Country/@Code', namespaces=namespaces):
print(country)
请注意 <aws:RankByCountry>
没有 Code
属性,但 <aws:Country>
有。
我想解析 RankByCountry 中的国家代码属性。我该怎么做?
表示-打印列表['GB'、'US'、'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>
已经试过了--
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]
该文档看起来很奇怪,因为它使用了两次 aws
命名空间前缀。您需要使用更具体的命名空间,因为这会覆盖前缀为 aws
的全局命名空间。其实你这样做是对的。
问题出在 xpath 表达式本身,它应该如下所示:
for country in tree.xpath('//aws:RankByCountry/aws:Country/@Code', namespaces=namespaces):
print(country)
请注意 <aws:RankByCountry>
没有 Code
属性,但 <aws:Country>
有。