在Python中提取XML节点

2 投票
4 回答
1290 浏览
提问于 2025-04-16 15:18

这是我有的一部分XML文档:

<tr><td>Image:</td><td>
<a href="http://live.astrometry.net/status.php?job=alpha-201104-6758393&amp;get=fullsize.png">fullsize.png</a></td></tr>

我需要提取一个属性,也就是在内容为'Image:'的<td>元素之后的<a>元素的href属性。这个<a>元素没有其他的id或class属性可以用。

抱歉,如果这样听起来有点复杂。

提前谢谢你们!

4 个回答

0

使用 lxml 这个库,详细信息可以查看 这里

你的 XPath 表达式可以写成 /tr/td[1]/a,这样可以找到你想要的元素,然后你可以用 el.attrib['href'] 来获取它的链接地址。

其实你可以不使用 XPath 也能遍历这个树状结构,但 XPath 是一个非常强大且有用的工具。

1

如果你的输入文件和你提供的例子差不多,下面的代码可能对你有帮助:

from xml.dom.minidom import parseString

def tdlinks(xml):
    o = []
    l = parseString(xml).getElementsByTagName('td')
    while l != []:
        if l[0].firstChild.wholeText == unicode('Image:') and len(l) > 1:
            if l[1].getElementsByTagName('a') != []:
                o.append(l[1].getElementsByTagName('a')[0].getAttribute('href'))
                l.pop(1)
        l.pop(0)
    return o

可以看看minidom的文档。如果在运行代码时发现了什么问题,这些文档可能会帮助你改进代码。

2

好的,最后给出一个优雅的(我希望是这样 ;))答案,使用一个简单的XPath表达式

from lxml import etree
root = etree.fromstring(your_text)
print root.xpath("//td[contains(text(), 'Image')]/following-sibling::td/a/@href")[0]

撰写回答