Кто-нибудь может сказать мне, что означает сообщение об ошибке «строка 1182 в синтаксическом анализе», когда я пытаюсь проанализировать и xml в python

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