2015-04-27 6 views
0

Мне нужно преобразовать веб-страницу в XML (используя Python 3.4.3). Если я пишу содержимое URL к файлу, то я могу прочитать и разобрать его отлично, но если я пытаюсь читать прямо с веб-страницы, я получаю следующее сообщение об ошибке в моем терминале:OSError: [Errno 36] Слишком длинное имя файла:

File "./AnimeXML.py", line 22, in xml = ElementTree.parse (xmlData) File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/xml/etree/ElementTree.py", line 1187, in parse tree.parse(source, parser) File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/xml/etree/ElementTree.py", line 587, in parse source = open(source, "rb") OSError: [Errno 36] File name too long:

Мой питон код :

# 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) 

есть ли способ, что я могу исправить мой код, так что я могу читать веб-страницу непосредственно в питон, не получая эту ошибку?

ответ

4

Как объяснено в Parsing XML сечения ElementTree документы:

We can import this data by reading from a file:

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

Or directly from a string:

root = ET.fromstring(country_data_as_string) 

можно передать все содержимое XML в виде гигантского пути. Ваш XML-файл, вероятно, больше 2K или любой размер максимального пути для вашей платформы, следовательно, ошибка. Если бы это было не так, вы просто получили бы другую ошибку, если бы не был каталог с именем [everything up to the first/in your XML file].

Просто используйте fromstring вместо parse.

Или обратите внимание, что parse может принимать файл, а не только имя файла. И вещь, возвращаемая urlopen, является файловым объектом.


заметить также очень следующую строку в этом разделе:

fromstring() parses XML from a string directly into an Element , which is the root element of the parsed tree. Other parsing functions may create an ElementTree .

Таким образом, вы не хотите, что root = tree.getroot() либо.


Итак:

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

Спасибо за ответ, проблема решается в настоящее время. Я новичок с python. –

+0

В чем разница между использованием «parse» и «fromstring»? –

+0

@JasterTDCClan: Это объясняется в документах, которые я связывал и цитировал: 'parse' принимает имя файла или файл,' fromstring' принимает строку. Я не знаю, как сделать это яснее. – abarnert