ET.findall()
vs BS4.find_all()
:
但是,ElementTree.iter()
会 。使用docs中的“使用命名空间”示例:
>>> for char in root.iter('{http://characters.example.com}character'):
… print(‘ |–>’, char.text) … |–> Lancelot |–> Archie Leach |–> Sir Robin |–> Gunther |–> Commander Clement
可悲的是,ET.iterfind()
它使用命名空间作为dict(例如ET.findall),也 , 默认情况下 仅引导子对象 * 。就像ET.findall。除了如何''
使用名称空间处理标记中的空字符串,一个返回列表,另一个返回迭代器,我不能说ET.findall
and之间存在有意义的区别ET.iterfind
。
当将名称空间与ET一起使用时,仍然需要带有标签的 名称空间名称 。结果行应为:
namespace = {'v': "urn:schemas-microsoft-com:vml"}
results = ET.fromstring(xml).findall("v:imagedata", namespace) # note the 'v:'
另外,'v'
不必是'v'
,您可以根据需要将其更改为更有意义的名称:
namespace = {'image': "urn:schemas-microsoft-com:vml"}
results = ET.fromstring(xml).findall("image:imagedata", namespace)
当然,如果它们不是根的直接子代,那么仍然不一定能为您提供所有imagedata元素。 为此,您需要创建
一个递归
函数来为您执行此操作。请注意,而答案不递归
搜索,你很可能会击中Python的递归限制,如果后代深度过......
深 。
要获取树中任何位置的所有imagedata元素,请使用".//"
前缀:
results = ET.fromstring(xml).findall(".//v:imagedata", namespace)