在Python中提取XML节点

时间:2011-04-07 21:22:44

标签: python xml

这是我拥有的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>

我需要在<a>元素后面提取内容为'Image:'的<td>元素的href属性。 <a>元素没有我可以使用的其他id或class属性。

对不起,如果这听起来很复杂

提前致谢!

4 个答案:

答案 0 :(得分:2)

好的,最后的优雅(我希望;)回答一个XPath表达式

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

答案 1 :(得分: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 :(得分:0)

使用lxml http://lxml.de/xpathxslt.html

您的XPath看起来像/tr/td[1]/a来获取元素,然后您可以el.attrib['href']

你可以在没有XPath的情况下实际遍历树,但它是非常强大且有用的工具

答案 3 :(得分:0)

from xml.dom import minidom

dom = minidom.parseString("""<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>
""")

print dom.toxml() + "\n"

links = (a.attributes['href'].value for a in dom.getElementsByTagName('a') 
    if a.parentNode.nodeName == 'td' and a.parentNode.previousSibling.firstChild.data == 'Image:')

for link in links:
    print link

结果:

<?xml version="1.0" ?><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>

http://live.astrometry.net/status.php?job=alpha-201104-6758393&get=fullsize.png