无法使用 lxml 按属性查找元素
Unable to find element by attribute with lxml
我正在使用欧洲 Space 机构 API 到 query (result can be viewed here) 将卫星图像元数据解析为 python objects.
使用 requests
库我可以成功获得 XML 格式的结果,然后使用 lxml
读取内容。我能够找到元素并按预期探索树:
# loading the response into an ElementTree
tree = etree.fromstring(response.content)
root = tree.getroot()
ns = root.nsmap
# get the first entry element and its summary
e = root.find('entry',ns)
summary = e.find('summary',ns).text
print summary
>> 'Date: 2018-11-28T09:10:56.879Z, Instrument: OLCI, Mode: , Satellite: Sentinel-3, Size: 713.99 MB'
entry 元素有几个 date 属性值不同的后代 name:
for d in e.findall('date',ns):
print d.tag, d.attrib
>> {http://www.w3.org/2005/Atom}date {'name': 'creationdate'}
{http://www.w3.org/2005/Atom}date {'name': 'beginposition'}
{http://www.w3.org/2005/Atom}date {'name': 'endposition'}
{http://www.w3.org/2005/Atom}date {'name': 'ingestiondate'}
我想使用 XPath 语法 [@attrib='value']
获取 beginposition 日期元素,但它只是 returns None。即使只是搜索具有名称属性 ([@attrib]
) returns None:
的日期元素
dt_begin = e.find('date[@name="beginposition"]',ns) # dt_begin is None
dt_begin = e.find('date[@name]',ns) # dt_begin is None
条目元素包括表现出相同行为的其他 children,例如多个 str 元素也具有不同的 name 属性。
有没有人遇到过类似的事情或者我遗漏了什么?我正在使用 Python 2.7.14 和 lxml 4.2.4
使用谓词 ([@name="beginposition"]
) 时,似乎需要显式前缀。这是一个测试程序:
from lxml import etree
print etree.LXML_VERSION
tree = etree.parse("data.xml")
ns1 = tree.getroot().nsmap
print ns1
print tree.find('entry', ns1)
print tree.find('entry/date', ns1)
print tree.find('entry/date[@name="beginposition"]', ns1)
ns2 = {"atom": 'http://www.w3.org/2005/Atom'}
print tree.find('atom:entry', ns2)
print tree.find('atom:entry/atom:date', ns2)
print tree.find('atom:entry/atom:date[@name="beginposition"]', ns2)
输出:
(4, 2, 5, 0)
{None: 'http://www.w3.org/2005/Atom', 'opensearch': 'http://a9.com/-/spec/opensearch/1.1/'}
<Element {http://www.w3.org/2005/Atom}entry at 0x7f8987750b90>
<Element {http://www.w3.org/2005/Atom}date at 0x7f89877503f8>
None
<Element {http://www.w3.org/2005/Atom}entry at 0x7f8987750098>
<Element {http://www.w3.org/2005/Atom}date at 0x7f898774a950>
<Element {http://www.w3.org/2005/Atom}date at 0x7f898774a7a0>
我正在使用欧洲 Space 机构 API 到 query (result can be viewed here) 将卫星图像元数据解析为 python objects.
使用 requests
库我可以成功获得 XML 格式的结果,然后使用 lxml
读取内容。我能够找到元素并按预期探索树:
# loading the response into an ElementTree
tree = etree.fromstring(response.content)
root = tree.getroot()
ns = root.nsmap
# get the first entry element and its summary
e = root.find('entry',ns)
summary = e.find('summary',ns).text
print summary
>> 'Date: 2018-11-28T09:10:56.879Z, Instrument: OLCI, Mode: , Satellite: Sentinel-3, Size: 713.99 MB'
entry 元素有几个 date 属性值不同的后代 name:
for d in e.findall('date',ns):
print d.tag, d.attrib
>> {http://www.w3.org/2005/Atom}date {'name': 'creationdate'}
{http://www.w3.org/2005/Atom}date {'name': 'beginposition'}
{http://www.w3.org/2005/Atom}date {'name': 'endposition'}
{http://www.w3.org/2005/Atom}date {'name': 'ingestiondate'}
我想使用 XPath 语法 [@attrib='value']
获取 beginposition 日期元素,但它只是 returns None。即使只是搜索具有名称属性 ([@attrib]
) returns None:
dt_begin = e.find('date[@name="beginposition"]',ns) # dt_begin is None
dt_begin = e.find('date[@name]',ns) # dt_begin is None
条目元素包括表现出相同行为的其他 children,例如多个 str 元素也具有不同的 name 属性。
有没有人遇到过类似的事情或者我遗漏了什么?我正在使用 Python 2.7.14 和 lxml 4.2.4
使用谓词 ([@name="beginposition"]
) 时,似乎需要显式前缀。这是一个测试程序:
from lxml import etree
print etree.LXML_VERSION
tree = etree.parse("data.xml")
ns1 = tree.getroot().nsmap
print ns1
print tree.find('entry', ns1)
print tree.find('entry/date', ns1)
print tree.find('entry/date[@name="beginposition"]', ns1)
ns2 = {"atom": 'http://www.w3.org/2005/Atom'}
print tree.find('atom:entry', ns2)
print tree.find('atom:entry/atom:date', ns2)
print tree.find('atom:entry/atom:date[@name="beginposition"]', ns2)
输出:
(4, 2, 5, 0)
{None: 'http://www.w3.org/2005/Atom', 'opensearch': 'http://a9.com/-/spec/opensearch/1.1/'}
<Element {http://www.w3.org/2005/Atom}entry at 0x7f8987750b90>
<Element {http://www.w3.org/2005/Atom}date at 0x7f89877503f8>
None
<Element {http://www.w3.org/2005/Atom}entry at 0x7f8987750098>
<Element {http://www.w3.org/2005/Atom}date at 0x7f898774a950>
<Element {http://www.w3.org/2005/Atom}date at 0x7f898774a7a0>