Разбор XML с использованием xml.etree.cElementTree - PullRequest
0 голосов
/ 10 июня 2010

У меня есть следующий XML в строке с именем 'xml':

<?xml version="1.0" encoding="ISO-8859-1"?>
<Book>
  <Page>
    <Text>Blah</Text>
  </Page>
</Book>

Я пытаюсь извлечь из него значение Blah, но у меня возникли проблемы с xml.etree.cElementTree.Я пробовал методы find () и findtext (), но ничего.В конце концов я сделал это:

import xml.etree.cElementTree as ET
...
root = ET.fromstring(xml)
element = root.getchildren()[0].getchildren()[0]

Элемент теперь равен элементу, что я и хочу (для этого решения в любом случае), но как мне получить внутренний текст из него?element.text не работает.Любые идеи?

РЕДАКТИРОВАТЬ: element.text дает мне нет

PS: я использую Python 2,5 атм.

В качестве дополнительного вопроса: что является лучшим способом для анализаXML-строки в Python?

Ответы [ 2 ]

3 голосов
/ 10 июня 2010

Пожалуйста, объясните, что для вас значит "не работает".Я предполагаю, что код, который вы запускали (или должен был запускать), работал для меня (Python 2.x для x в (5, 6)) - см. Ниже.Он даже работал на Python 2.1 с соответствующими изменениями в операторе импорта.Обратите внимание, что я отобразил element.tag, чтобы показать, что он относится к нужному элементу.

>>> xml = """\
... <?xml version="1.0" encoding="ISO-8859-1"?>
... <Book>
...   <Page>
...     <Text>Blah</Text>
...   </Page>
... </Book>
... """
>>> import xml.etree.cElementTree as ET
>>> root = ET.fromstring(xml)
>>> element = root.getchildren()[0].getchildren()[0]
>>> element.tag
'Text'
>>> element.text
'Blah'
>>>

Возможно, вы захотите пройти проверку на дополнительный вопрос, пока мы не разберемся с первым.; -)

0 голосов
/ 15 марта 2017

Для немассивных .xmls (может быть, несколько мегабайт) способ, которым вы это делаете, должен быть нормальным, но если вы знаете тег и просто хотите получить значение в качестве выходного, я нашел способ сделать это, главным образом благодаряhttp://enginerds.craftsy.com/blog/2014/04/parsing-large-xml-files-in-python-without-a-billion-gigs-of-ram.html, но изменил его для моих нужд и даже не нуждается в xml.etree.Например:

path = 'yourxmlfilepath.xml'
tagyouwant='Headline' #just an example, i wanted the text between 'Headline' tags
opentag='<'+tagyouwant+'>'
closetag='</'+tagyouwant+'>'

with open(path,'rb') as inputfile:
    for line in inputfile:
        if opentag in line:
            strtoget=str(line)
            strtoget=strtoget.replace(opentag,"") #trimming the tags from the text
            strtoget=strtoget.replace(closetag,"")
            print strtoget

вместо окончательного оператора печати вы можете делать то, что вы хотите, со строкой, которую вы сейчас имеете.Кроме того, вы также можете запустить это как пакет или командную строку и вывести в .txt и сохранить все значения, как вы идете таким образом (на самом деле зависит от того, что вы хотите с ним делать).

В любом случае, я думалэто был умный, эффективный способ памяти для анализа огромных XML-файлов, когда вы точно знаете, что вы хотите из него извлечь.

...