OSError:[Errno 36]文件名太长:

时间:2015-04-27 09:00:35

标签: python xml

我需要将网页转换为XML(使用Python 3.4.3)。如果我将URL的内容写入文件,那么我可以完美地阅读和解析它,但如果我尝试直接从网页上读取,我的终端会收到以下错误:

  

文件" ./ AnimeXML.py",第22行,in           xml = ElementTree.parse(xmlData)         文件" /Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/xml/etree/ElementTree.py" ;,第1187行,解析           tree.parse(source,parser)         文件" /Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/xml/etree/ElementTree.py",第587行,解析           source = open(来源," rb")       OSError:[Errno 36]文件名太长:

我的python代码:

# AnimeXML.py
#! /usr/bin/Python

# Import xml parser.
import xml.etree.ElementTree as ElementTree

# XML to parse.
sampleUrl = "http://cdn.animenewsnetwork.com/encyclopedia/api.xml?anime=16989"

# Read the xml as a file.
content = urlopen (sampleUrl)

# XML content is stored here to start working on it.
xmlData = content.readall().decode('utf-8')

# Close the file.
content.close()

# Start parsing XML.
xml = ElementTree.parse (xmlData)

# Get root of the XML file.
root = xml.getroot()

for info in root.iter("info"):
    print (info.attrib)

有什么方法可以修复我的代码,这样我就可以直接将网页读入python而不会出现此错误吗?

1 个答案:

答案 0 :(得分:9)

正如ElementTree文档的Parsing XML部分所述:

  

我们可以通过从文件中读取来导入此数据:

import xml.etree.ElementTree as ET
tree = ET.parse('country_data.xml')
root = tree.getroot()
  

或直接来自字符串:

root = ET.fromstring(country_data_as_string)

您将整个XML内容作为巨型路径名传递。您的XML文件可能大于2K,或者您的平台的最大路径名大小,因此错误。如果不是,那么你就会得到一个关于没有名为[everything up to the first / in your XML file]的目录的错误。

只需使用fromstring代替parse

或者,请注意parse可以获取文件对象,而不仅仅是文件名。而urlopen返回的内容是文件对象。

另请注意该部分的下一行:

  

fromstring()将字符串中的XML直接解析为Element,这是解析树的根元素。其他解析函数可能会创建ElementTree

所以,你也不希望root = tree.getroot()

所以:

# ...
content.close()
root = ElementTree.fromstring(xmlData)