在XML python中使用属性值作为过滤器

时间:2017-08-31 17:24:25

标签: python xml attributes

我有下面的xml文件和

data_string = """
<Bookstore>
   <Book ISBN="ISBN-13:978-1599620787" Price="15.23" Weight="1.5">
      <Title>New York Deco</Title>
      <Authors>
         <Author Residence="New York City">
            <First_Name>Richard</First_Name>
            <Last_Name>Berenholtz</Last_Name>
         </Author>
      </Authors>
   </Book>
   <Book ISBN="ISBN-13:978-1579128562" Price="15.80">
      <Remark>
      Five Hundred Buildings of New York and over one million other books are available for Amazon Kindle.
      </Remark>
      <Title>Five Hundred Buildings of New York</Title>
      <Authors>
         <Author Residence="Beijing">
            <First_Name>Bill</First_Name>
            <Last_Name>Harris</Last_Name>
         </Author>
         <Author Residence="New York City">
            <First_Name>Jorg</First_Name>
            <Last_Name>Brockmann</Last_Name>
         </Author>
      </Authors>
   </Book>
</Bookstore>
"""

我有一个示例代码&#34;找一本重1.5盎司的书的作者的名字&#34;

root.find('Book[@Weight="1.5"]/Authors/Author/First_Name').text

这很好用。

然后我尝试通过过滤提取last_name 使用下面的代码

root.find('Author[@Residence="New York City"]/Last_Name').text

它给了我一个错误

AttributeError: 'NoneType' object has no attribute 'text'

我该如何解决这个问题?为什么这是错的?谢谢!

1 个答案:

答案 0 :(得分:1)

在这种情况下,查询应为:

root.find('Book/Authors/Author[@Residence="New York City"]/Last_Name').text

因为您从根开始搜索,而您只能看到根Bookstore的直接子项,即Book标记。

请注意,由于您有许多作者居住在纽约,您可能需要找到所有作者:

names = [tag.text for tag in root.findall('Book/Authors/Author[@Residence="New York City"]/Last_Name')]

print(names)
>>>['Berenholtz', 'Brockmann']

此处findall返回包含作者姓氏标记的列表,您可以迭代并应用text属性