Сохранять префикс пространства имен в теге при синтаксическом анализе xml с использованием lxml - PullRequest
1 голос
/ 04 августа 2020

У меня xml, как показано ниже. Есть несколько тегов с префиксом ce, например <ce:title>. Когда я запускаю приведенный ниже код с xpath, на выходе <ce:title> заменяется <title>. Я видел другие ссылки на SO, например Как сохранить информацию о пространстве имен при разборе HTML с l xml? , но не уверен, где и как добавить детали пространства имен.

Может кто-нибудь, пожалуйста предлагать ? Как сохранить <ce:title> для xml ниже?

from lxml import html
from lxml.etree import tostring
with open('102277033304.xml', encoding='utf-8') as file_object:
    xml = file_object.read().strip()
    root = html.fromstring(xml)
    for element in root.xpath('//item/book/pages/*'):
        html = tostring(element, encoding='utf-8')
        print(html)

XML:

<item>
    <book>
        <pages>
            <page-info>
                <page>
                  <ce:title>Chapter 1</ce:title>
                  <content>Welcome to Chapter 1</content>
                </page>
                <page>
                 <ce:title>Chapter 2</ce:title>
                 <content>Welcome to Chapter 2</content>
                </page>
            </page-info>
            <page-fulltext>Published in page 1</page-fulltext>
            <page-info>
                <page>
                  <ce:title>Chapter 1</ce:title>
                  <content>Welcome to Chapter 1</content>
                </page>
                <page>
                 <ce:title>Chapter 2</ce:title>
                 <content>Welcome to Chapter 2</content>
                </page>
            </page-info>
            <page-fulltext>Published in page 2</page-fulltext>
            <page-info>
                <page>
                  <ce:title>Chapter 1</ce:title>
                  <content>Welcome to Chapter 1</content>
                </page>
                <page>
                 <ce:title>Chapter 2</ce:title>
                 <content>Welcome to Chapter 2</content>
                </page>
            </page-info>
            <page-fulltext>Published in page 3</page-fulltext>
        </pages>
    </book>
</item>

1 Ответ

1 голос
/ 05 августа 2020

Вероятно, это вызвано тем, что вы используете парсер html для чтения xml.

Попробуйте это так:

from lxml import etree
root = etree.XML(xml)
for element in root.xpath('//item/book/pages/*'):
        xml = etree.tostring(element, encoding='utf-8')
        print(xml)

Это должно дать вам ожидаемый вывод.

...