[英]lxml and CDATA and &
我有一個包含CDATA的XML,並且其中包含帶有帶有&符號的URL的標記。 我應該使用lxml來讀取這些標簽,但出現錯誤。
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "src\lxml\lxml.etree.pyx", line 3228, in lxml.etree.fromstring (src\lxml\lxml.etree.c:79593)
File "src\lxml\parser.pxi", line 1848, in lxml.etree._parseMemoryDocument (src\lxml\lxml.etree.c:119112)
File "src\lxml\parser.pxi", line 1729, in lxml.etree._parseDoc (src\lxml\lxml.etree.c:117670)
File "src\lxml\parser.pxi", line 1063, in lxml.etree._BaseParser._parseUnicodeDoc (src\lxml\lxml.etree.c:111657)
File "src\lxml\parser.pxi", line 595, in lxml.etree._ParserContext._handleParseResultDoc (src\lxml\lxml.etree.c:105880)
File "src\lxml\parser.pxi", line 706, in lxml.etree._handleParseResult (src\lxml\lxml.etree.c:107588)
File "src\lxml\parser.pxi", line 635, in lxml.etree._raiseParseError (src\lxml\lxml.etree.c:106442)
File "<string>", line 9
lxml.etree.XMLSyntaxError: EntityRef: expecting ';', line 9, column 98
我如何克服這個錯誤? 我說的對嗎? 我們需要用什么代替&嗎?
代碼如下
from lxml import etree
ns0_NAMESPACE = "http://webservices.online.webapp.paperless.cl"
ns0 = "{%s}" % ns0_NAMESPACE
NSMAP = {'ns0':ns0_NAMESPACE}
response="""
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<ns:OnlineGeneration2Response xmlns:ns="http://webservices.online.webapp.cl">
<ns:return>
<![CDATA[<EstadoDoc>
<Estado>Ok<Estado>
<RutEmisor>81201000-K</RutEmisor>
<TipoDte>52</TipoDte>
<FolioM>117620901</FolioM>
<Folio>25022</Folio>
<Glosa>NO INFORMADO</Glosa>
<UrlDte>http://G500603svGLH:8080/Facturacion/XMLServlet?docId=&uR1v4VhQHvkPrUZDtY6hMg==</UrlDte>
</EstadoDoc>
<EstadoLote>
<UrlPdf>http://G500603svGLH:8080/Facturacion/PDFServlet?docId=uR1v4VhQHvmQJLl22c1DFOLW3c4qbQ47</UrlPdf>
<UrlCaratula>http://G500603svGLH:8080/Facturacion/XMLServlet?docId=&uR1v4VhQHvmQJLl22c1DFOLW3c4qbQ47</UrlCaratula>
</EstadoLote>]]>
</ns:return>
</ns:OnlineGeneration2Response>
</soapenv:Body>
</soapenv:Envelope>"""
root=etree.fromstring(response)
sub_element=root.xpath('//ns0:return',namespaces=NSMAP)
print sub_element.text
if sub_element:
sub_element=sub_element[0]
EstadoDoc_root=etree.fromstring(sub_element.text)
問題在於<ns:return>
元素的文本(CDATA部分)的內容不是合法的XML。 如果您將&
替換為&
在將該文本傳遞給etree.fromstring
之前,解析應該成功。
通常,將XML隱藏在CDATA節中不是一個好主意。 這只是它可能引起的問題的一個例子。 如果您對生成此XML的一方有任何影響,建議您嘗試讓他們進行更改。
使用XML解析器的恢復選項:
parser = etree.XMLParser(recover=True)
EstadoDoc_root = etree.fromstring(sub_element.text, parser=parser)
然后獲取URL(或將其更改為所需的URL):
print [x.text for x in EstadoDoc_root.xpath('//UrlCaratula|//UrlPdf')]
['http://G500603svGLH:8080/Facturacion/PDFServlet?docId=uR1v4VhQHvmQJLl22c1DFOLW3c4qbQ47',
'http://G500603svGLH:8080/Facturacion/XMLServlet?docId=']
第二個URL缺少&后面的URL部分。有沒有辦法避免這種情況?
使用html解析器來規范化和處理違規字符(請注意小寫標記)
from lxml import html
EstadoDoc_root = html.fromstring(sub_element)
print [x.text for x in EstadoDoc_root.xpath('//urlcaratula|//urlpdf')]
['http://G500603svGLH:8080/Facturacion/PDFServlet?docId=uR1v4VhQHvmQJLl22c1DFOLW3c4qbQ47',
'http://G500603svGLH:8080/Facturacion/XMLServlet?docId=&uR1v4VhQHvmQJLl22c1DFOLW3c4qbQ47']
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.