【问题标题】:ElementTree XML Parsing just returns sitemap.org?ElementTree XML 解析只返回 sitemap.org?
【发布时间】:2014-02-24 19:39:03
【问题描述】:

试图四处寻找一个简单的解释,说明我哪里出了问题,但真的找不到。以下代码摘录:

import time, threading, urllib2, os
import xml.etree.ElementTree as ET

save_path = '/Users/sampeka/Desktop/Programming/SilkySpider/Data'
bloomberg_site_map = urllib2.urlopen('http://www.bloomberg.com/sitemap_news.xml').read()
reuters_site_map = urllib2.urlopen('http://www.reuters.com/sitemap_news_index.xml').read()

def saveXmlFile(data,name):
    try:
        abs_path = os.path.abspath(save_path)
        open_file = open(abs_path+'/'+name,'w')
        open_file.write(data)
    finally:
        open_file.close()

class ParseXML:

    def __init__(self,xml_file):
        self.xml_file = xml_file

    def printStuff(self):
        tree = ET.parse(self.xml_file)
        root = tree.getroot()
        for child in root:
            print child.tag, child.attrib


saveXmlFile(bloomberg_site_map,'Bloomberg Site Map.xml')
ParseXML(save_path+'/Bloomberg Site Map.xml').printStuff()

多次返回:

{http://www.sitemaps.org/schemas/sitemap/0.9}url
{http://www.sitemaps.org/schemas/sitemap/0.9}url
{http://www.sitemaps.org/schemas/sitemap/0.9}url
{http://www.sitemaps.org/schemas/sitemap/0.9}url
{http://www.sitemaps.org/schemas/sitemap/0.9}url

XML 被正确保存,所以我一定是遗漏了一些简单的东西。有人可以解释为什么这会卡在这个问题上吗?非常感谢您的帮助。

【问题讨论】:

    标签: python xml-parsing elementtree


    【解决方案1】:

    您的代码正在遍历 XML 根元素的子元素。由于您的 XML 文档(查看了bloomberg 文档)包含:

    <urlset ...>
      <url ...>
        ...
      </url>
      <url ...>
        ...
      </url>
      ...
    </urlset>
    

    输出是url 元素的列表。

    你还没有说明你想要得到什么输出。但是,您很可能需要递归地遍历每个 XML 元素,或者使用 xpath 来提取文档的特定部分。

    示例:提取publication_date 字段:

    import lxml.etree
    tree = lxml.etree.parse(self.xml_file)
    root = tree.getroot()
    for pd in root.xpath("//*[local-name()='publication_date' and namespace-uri()='http://www.google.com/schemas/sitemap-news/0.9']"):
        print pd.text
    

    【讨论】:

    • 这会引发 AttributeError: 'Element' object has no attribute 'xpath'
    • @SamP:抱歉,我使用了lxml.etree 而不是lxml.etree.ElementTree。相应地更新了答案。
    猜你喜欢
    • 1970-01-01
    • 2021-02-08
    • 1970-01-01
    • 2017-07-02
    • 1970-01-01
    • 2023-03-25
    • 2021-02-06
    • 2017-08-31
    • 1970-01-01
    相关资源
    最近更新 更多