Я пытаюсь использовать ElementTree с этим примером данных из Microsoft которую я только что скопировал и вставил в строку (возможно наивно).

Я ввел все данные XML в строку следующим образом (это усеченный пример, но я использовал весь XML):

  data2 = '''
<?xml version="1.0"?>
<catalog>
   <book id="bk101">
      <author>Gambardella, Matthew</author>
        etc 
        etc'''

Затем использовал этот код:

import xml.etree.ElementTree as ET    
tree2 = ET.fromstring(data2)
print (tree2.find('author').text)

И я получаю этот выход:

ParseError: XML or text declaration not at start of entity: line 2, column 0

Тем не менее, когда я пытаюсь простой пример, это работает:

data = '''
<p>
  <name>Fred</name>
</p>'''

tree = ET.fromstring(data)
print (tree.find('name').text)

Вне:

Fred

Это потому, что я сделал копию и вставил или мой код неверен? Пожалуйста, покажи мне, что я делаю не так здесь.

1
nipy 13 Янв 2017 в 15:54

5 ответов

Лучший ответ

1 - первая строка должна быть похожа на "<?xml version="1.0"?>", поэтому сначала вы удалите (data2)

import xml.etree.ElementTree as ET  

data2 = '''
<?xml version="1.0"?>
<catalog>
   <book id="bk101">
      <author>Gambardella, Matthew</author>
   </book>
   <book id="bk2">
      <author>Gambardella2, Matthew2</author>
   </book>
</catalog>
'''
data2 = data2.strip()

tree2 = ET.fromstring(data2)

for book in tree2.findall('book'):
     autor = book.find('author').text
     print (autor)
1
Danil.V 13 Янв 2017 в 13:23

Во-первых, тег <?xml version... должен находиться в самом начале строки.

Ваши данные имеют символ новой строки в начале, что делает формат недействительным.

Плохо:

data = '''
<?xml version="1.0"?>
<catalog>
   <book id="bk101">
      <author>Gambardella, Matthew</author>
        etc 
        etc'''

assert data[0] == '\n'

Хорошо:

import xml.etree.ElementTree as ET

data = '''<?xml version="1.0"?>
<catalog>
   <book id="bk101">
      <author>Gambardella, Matthew</author>
   </book>
</catalog>'''


catalog = ET.fromstring(data)
for book in catalog.getchildren():
    for author in book.getchildren():
        print(author.text)
0
Vasili Syrakis 13 Янв 2017 в 13:10
import xml.etree.ElementTree as ET 

data2 = '''<?xml version="1.0"?>
<catalog>
   <book id="bk101">
      <author>Gambardella, Matthew</author>
      <title>XML Developer's Guide</title>
      <genre>Computer</genre>
      <price>44.95</price>
      <publish_date>2000-10-01</publish_date>
      <description>An in-depth look at creating applications with XML.</description>
   </book>
   <book id="bk112">
      <author>Galos, Mike</author>
      <title>Visual Studio 7: A Comprehensive Guide</title>
      <genre>Computer</genre>
      <price>49.95</price>
      <publish_date>2001-04-16</publish_date>
      <description>Microsoft Visual Studio 7 is explored in depth,
      looking at how Visual Basic, Visual C++, C#, and ASP+ are 
      integrated into a comprehensive development 
      environment.</description>
   </book>
</catalog>'''

data2 = data2.strip()
root = ET.fromstring(data2)

for node in root.iter():
    print node.tag, node.text
1
nguaman 13 Янв 2017 в 13:11
data2 = '''<?xml version="1.0"?>
<catalog>
   <book id="bk101">
      <author>Gambardella, Matthew</author>'''

Не начинайте с пустой строки.

1
宏杰李 13 Янв 2017 в 13:10

Удалить <?xml version="1.0"?> из data2 с заменой.

Должен быть способ указать эти вещи, но мне было все равно, когда я наткнулся на это, когда я разбирал сайты с совершенно другим пониманием того, как выглядит действительный HTML.

-1
Harper04 13 Янв 2017 в 12:58