При условии, что у меня есть XML следующим образом: обратите внимание, что атрибуты xml:id являются строками, НАЧИНАЮЩИМИСЯ ЦИФРАМИ
<node1>
<text xml:id='7865ft6zh67'>
<div chapter='0'>
<div id='theNode'>
<p xml:id="40">
A House that has:
<p xml:id="45">- a window;</p>
<p xml:id="46">- a door</p>
<p xml:id="46">- a door</p>
its a beuatiful house
</p>
</div>
</div>
</text>
</node1>
Я хотел бы найти заголовок текста и получить весь текст из первого тега p, появляющегося внутри узла книги заголовка текста.
Первый подход можно сделать, используя ответы здесь: node-включая">выражение lxml xpath для выбора всего текста в заданном дочернем узле, включая его дочерние элементы (мой собственный вопрос)
Но в этом новом XML (по сравнению с упомянутым вопросом) xml:id начинаются с числа, и, как указано в одном из этих ответов, при использовании кода возникает следующая ошибка:
xml:id : attribute value 7865ft6zh67 is not an NCName, line 3, column 31
Как я могу по-прежнему анализировать XML с этим несоответствием XML xml:id?
Пока единственное решение, которое я могу придумать, это передать xml в строку и добавить букву в начале каждого из этих xml:id, например:
newXML = '...hange><change xml:id="6f58f74883d55b...'
newXML_repared = newXML.replace('xml:id="','xml:id="XXid')
newXML_repared
from lxml import etree
XML_tree = etree.fromstring(newXML_repared,parser=parser)
но при этом я получаю:
ValueError: Unicode strings with encoding declaration are not supported. Please use bytes input or XML fragments without declaration.
Любое предложение?
примечание: я заметил, что сама строка начинается с:
<?xml version="1.0" encoding="UTF-8"?>
<teiCorpus subtype="simple" ...etc
В учебнике lxml можно прочитать: Однако для этого требуется, чтобы строки Unicode сами не указывали конфликтующую кодировку и, таким образом, лгали об их реальной кодировке: (https://lxml.de/parsing.html)
Но я до сих пор не знаю, как решить проблему тогда
Спасибо.
bs4
вы можете использовать селекторы CSS + собственный API bs4. - person Andrej Kesely   schedule 22.06.2020