При условие, че имам 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 таг, който се появява във възела на текстовото заглавие на книгата
Първият подход може да бъде направен с помощта на отговорите тук: 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