2014-10-29 4 views
-2

Так, например, у меня есть XML-документ:Как разобрать XML с LXML

<?xml version="1.0"?> 
<a> 
    <b>Text I need</b> 
</a> 
<a> 
    <b>Text I need2</b> 
</a> 

Как я разобрать все тексты внутри Б. Я прочитал весь свой файл в строке. Я знаю только, как разобрать html, попробовал применить его к html, но не смог.

from lxml import html 
string = myfile.read(); 
tree = html.fromstring(string); 
result = tree.xpath('//a/@b'); 

Но это не будет работать.

+0

Что значит «не будет работать» означает? Получаете ли вы ошибку или пустой результат? – ErlVolton

+1

Вы читали документацию 'lxml'? Зачем использовать парсер HTML, если у вас есть XML, в любом случае? –

+0

да, я получаю пустую строку. Я не понял документацию для части xml. Это было странно. – Dancia

ответ

1

Первое, что вам нужно сделать, это убедиться, что ваш XML-файл правильно отформатирован для lxml. Если весь документ не содержится в общем теге «тело», анализатор lxml завершится с ошибкой. Могу ли я сделать это предложение:

<?xml version="1.0"?> 
<body> 
    <a> 
    <b>Text I need</b> 
    </a> 
    <a> 
    <b>Text I need2</b> 
    </a> 
</body> 

Обращаем внимание на этот файл как на "foo.xml". Теперь, когда этот формат данных лучше для синтаксического анализа, импорт etree из библиотеки LXML:

from lxml import etree as et 

Теперь настало время, чтобы разобрать данные и создать корневой объект, с которого начинается:

file_name = r"C:\foo.xml" 
xmlParse = et.parse(file_name) #Parse the xml file 
root = xmlParse.getroot() #Get the root 

После объявлен корневой объект, теперь мы можем использовать метод getiterator() для итерации всех тегов b. Поскольку метод getiterator() - это именно то, что он напоминает, итератор, мы можем использовать понимание списка для сохранения объектов элемента в списке. Оттуда мы можем изменить текст между тегами Ъ:

bTags = [tag for tag in root.getiterator("b")] #List comprehension with the iterator 
bTags[0].text = "Change b tag 1." #Change tag from "Text I need" 
bTags[1].text = "Change b tag 2." #Change tag from "Text I need2" 
xmlParse.write(file_name) #Edit original xml file 

Конечный результат должен выглядеть примерно так:

<?xml version="1.0"?> 
<body> 
    <a> 
    <b>Change b tag 1.</b> 
    </a> 
    <a> 
    <b>Change b tag 2.</b> 
    </a> 
</body> 
Смежные вопросы