#python #xml #parsing #url #elementtree
#python #xml #синтаксический анализ #url #elementtree
Вопрос:
Это код, который приводит к сообщению об ошибке:
import urllib
import xml.etree.ElementTree as ET
url = raw_input('Enter URL:')
urlhandle = urllib.urlopen(url)
data = urlhandle.read()
tree = ET.parse(data)
Ошибка:
Я новичок в python. Я прочитал документацию и пару руководств, но, очевидно, я все еще сделал что-то не так. Я не верю, что это сам XML-файл, потому что он делает это с двумя разными XML-файлами.
Комментарии:
1. Это называется трассировкой. См docs.python.org/3/tutorial/errors.html для объяснения того, что это значит.
2. Пожалуйста, опубликуйте фактический текст этой ошибки вместо изображения. Таким образом, другие могут найти его при поиске.
3. Передайте ответ, а не содержимое
tree = ET.parse(urllib.urlopen(url))
Ответ №1:
Рассмотрите возможность использования ElementTree fromstring()
:
import urllib
import xml.etree.ElementTree as ET
url = raw_input('Enter URL:')
# http://feeds.bbci.co.uk/news/rss.xml?edition=int
urlhandle = urllib.urlopen(url)
data = urlhandle.read()
tree = ET.fromstring(data)
print ET.tostring(tree, encoding='utf8', method='xml')
Комментарии:
1. Отлично! Пожалуйста, примите наиболее полезный ответ для подтверждения разрешения.
Ответ №2:
data
является ссылкой на содержимое XML в виде строки, но parse()
функция ожидает имя файла или файловый объект в качестве аргумента. Вот почему возникает ошибка.
urlhandle
это файловый объект, поэтому tree = ET.parse(urlhandle)
он должен работать для вас.
Комментарии:
1. Просто примечание для всех, кто ищет это, и для mzjn, это сработало одинаково хорошо с другим вариантом, но я могу «проверить» только один ответ (как полный новичок, я нахожу это странным, поскольку даже при минимальном опыте я нахожу, что обычно существует несколько способов создания функционального кода). В любом случае, это сработало 🙂
Ответ №3:
Сообщение об ошибке указывает на то, что ваш код пытается открыть файл, имя которого хранится в переменной source.
Не удается открыть этот файл (IOError), потому что переменный источник содержит кучу XML, а не имя файла.
Комментарии:
1. Спасибо Даниэль. Я подумал, что способ, которым я справился с получением URL-адреса, его открытием и последующим анализом, выглядит неуклюжим, но я не смог найти правильный способ сделать это. Существует ли однострочный синтаксис, который может принимать входные данные, а затем анализировать их как xml?
2. Вы дважды используете исходный код, один раз в качестве имени файла, а затем заменяете его новым дескриптором файла. Попробуйте что-то вроде inFile = open(source, «rb»)
3. Нет, это вводит в заблуждение.
source
происходит из исходного кода библиотеки ElementTree, а не из кода OP.