首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >lxml和CDATA和&

lxml和CDATA和&
EN

Stack Overflow用户
提问于 2017-07-20 00:00:10
回答 2查看 1K关注 0票数 2

我有一个XML,它有CDATA,其中有带有带有符号的URL的标记。我应该使用lxml来读取这些标记,但是我得到了一个错误。

代码语言:javascript
复制
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

我怎么能克服这个错误呢?我做得对吗?我们需要用什么东西来代替吗?

代码如下

代码语言:javascript
复制
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)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-20 05:31:36

使用XML解析器的恢复选项:

代码语言:javascript
复制
parser = etree.XMLParser(recover=True)

EstadoDoc_root = etree.fromstring(sub_element.text, parser=parser)

然后获取URL(或将其更改为所需的任何内容):

代码语言:javascript
复制
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解析器来规范和处理违规字符(注意小写标记)

代码语言:javascript
复制
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']
票数 1
EN

Stack Overflow用户

发布于 2017-07-20 05:01:26

问题是,<ns:return>元素的文本( CDATA部分)的内容不是合法的XML。如果将文本中的&替换为&amp;,然后将其传递给etree.fromstring,解析就会成功。

通常,将XML隐藏在CDATA部分并不是一个好主意;这只是它可能造成的问题的一个例子。如果您对生成此XML的方有任何影响,我建议您尝试让他们更改它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45202957

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档