Python 如何使用Beautiful Soup从xml标记中提取属性?

Python 如何使用Beautiful Soup从xml标记中提取属性?,python,xml,attributes,beautifulsoup,Python,Xml,Attributes,Beautifulsoup,我正在尝试使用Django中的Beauty Soup来提取xml标记。这是我正在使用的标签示例: <item> <title> Title goes here </title> <link> Link1 goes here </link> <description> Description goes here </description> <media:thumbnail url="Image URL go

我正在尝试使用Django中的Beauty Soup来提取xml标记。这是我正在使用的标签示例:

<item>
<title>
Title goes here
</title>
<link>
Link1 goes here
</link>
<description>
Description goes here
</description>
<media:thumbnail url="Image URL goes here" height="222" width="300"/>
<pubDate>Thu, 15 Sep 2016 13:24:48 EDT</pubDate>
<guid isPermaLink="true">
Link2 goes here
</guid>
</item>

帮助

问题是因为并非每个项目都有媒体:缩略图,因此您需要首先检查:

In [60]: import requests

In [61]: from  bs4 import BeautifulSoup

In [62]: soup = BeautifulSoup(requests.get("https://rss.sciencedaily.com/computers_math/computer_programming.xml").content, "xml")

In [63]: 

In [63]: for item in soup.find_all("item"):
   ....:         thumb = item.find("thumbnail")
   ....:         if thumb:
   ....:                 print(thumb["url"])
   ....:         
https://images.sciencedaily.com/2016/09/160915132448.jpg
https://images.sciencedaily.com/2016/09/160915090018.jpg
https://images.sciencedaily.com/2016/09/160914090327.jpg
https://images.sciencedaily.com/2016/09/160913134149.jpg
https://images.sciencedaily.com/2016/09/160909094844.jpg
https://images.sciencedaily.com/2016/09/160907125004.jpg
https://images.sciencedaily.com/2016/09/160906085157.jpg
https://images.sciencedaily.com/2016/08/160831085055.jpg
https://images.sciencedaily.com/2016/08/160822181811.jpg
https://images.sciencedaily.com/2016/08/160815134941.jpg
https://images.sciencedaily.com/2016/08/160815134817.jpg
https://images.sciencedaily.com/2016/08/160809095640.jpg
https://images.sciencedaily.com/2016/08/160803140137.jpg
https://images.sciencedaily.com/2016/07/160722104135.jpg
https://images.sciencedaily.com/2016/07/160721144139.jpg
https://images.sciencedaily.com/2016/07/160721103855.jpg
https://images.sciencedaily.com/2016/07/160720094641.jpg
https://images.sciencedaily.com/2016/07/160718133206.jpg
https://images.sciencedaily.com/2016/07/160713105850.jpg
https://images.sciencedaily.com/2016/07/160711151055.jpg
https://images.sciencedaily.com/2016/07/160707083258.jpg
https://images.sciencedaily.com/2016/06/160629125823.jpg
https://images.sciencedaily.com/2016/06/160627125140.jpg
https://images.sciencedaily.com/2016/06/160624101050.jpg
https://images.sciencedaily.com/2016/06/160622104810.jpg
更快的替代方案是使用lxml:


让我们看看你迄今为止所做的尝试。非常感谢!但是由于我在Django项目中,
listImage.append(items.find(“media:thumbnail”)[“url”])
抛出了一个
TypeError(“'NoneType'对象不可订阅“)
错误。除了这一行,其他一切都很完美。我正在使用XML解析器作为指向XML公共的链接?是的,它是公共的啊!谢谢你,伙计。非常感谢。
In [60]: import requests

In [61]: from  bs4 import BeautifulSoup

In [62]: soup = BeautifulSoup(requests.get("https://rss.sciencedaily.com/computers_math/computer_programming.xml").content, "xml")

In [63]: 

In [63]: for item in soup.find_all("item"):
   ....:         thumb = item.find("thumbnail")
   ....:         if thumb:
   ....:                 print(thumb["url"])
   ....:         
https://images.sciencedaily.com/2016/09/160915132448.jpg
https://images.sciencedaily.com/2016/09/160915090018.jpg
https://images.sciencedaily.com/2016/09/160914090327.jpg
https://images.sciencedaily.com/2016/09/160913134149.jpg
https://images.sciencedaily.com/2016/09/160909094844.jpg
https://images.sciencedaily.com/2016/09/160907125004.jpg
https://images.sciencedaily.com/2016/09/160906085157.jpg
https://images.sciencedaily.com/2016/08/160831085055.jpg
https://images.sciencedaily.com/2016/08/160822181811.jpg
https://images.sciencedaily.com/2016/08/160815134941.jpg
https://images.sciencedaily.com/2016/08/160815134817.jpg
https://images.sciencedaily.com/2016/08/160809095640.jpg
https://images.sciencedaily.com/2016/08/160803140137.jpg
https://images.sciencedaily.com/2016/07/160722104135.jpg
https://images.sciencedaily.com/2016/07/160721144139.jpg
https://images.sciencedaily.com/2016/07/160721103855.jpg
https://images.sciencedaily.com/2016/07/160720094641.jpg
https://images.sciencedaily.com/2016/07/160718133206.jpg
https://images.sciencedaily.com/2016/07/160713105850.jpg
https://images.sciencedaily.com/2016/07/160711151055.jpg
https://images.sciencedaily.com/2016/07/160707083258.jpg
https://images.sciencedaily.com/2016/06/160629125823.jpg
https://images.sciencedaily.com/2016/06/160627125140.jpg
https://images.sciencedaily.com/2016/06/160624101050.jpg
https://images.sciencedaily.com/2016/06/160622104810.jpg
from lxml import etree

for item in tree.findall(".//item/media:thumbnail",tree.nsmap):
     parent = item.getparent()
     print(parent.xpath("title/text()")[0])
     print(parent.xpath("link/text()")[0])
     print(item.get("url"))