2017-07-20 17 views
1

私はCDATAを持つXMLを持っており、その中にアンパサンドを持つURLを持つタグがあります。私はこれらのタグを読み取るためにlxmlを使用するはずですが、私はエラーが発生しています。lxmlとCDATAと&

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 

どうすればこのエラーが発生しますか?私は正しいことをしていますか? &を何かに置き換える必要がありますか?

コード問題が<ns:return>要素のテキスト(CDATAセクション)の内容が有効なXMLではないということである

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) 

答えて

1

使用のXMLパーサのオプションを回復

print [x.text for x in EstadoDoc_root.xpath('//UrlCaratula|//UrlPdf')] 

['http://G500603svGLH:8080/Facturacion/PDFServlet?docId=uR1v4VhQHvmQJLl22c1DFOLW3c4qbQ47', 
'http://G500603svGLH:8080/Facturacion/XMLServlet?docId='] 

2番目のURLは、の部分が欠落していますURLが& の後に来る...これを避ける方法はありますか?

2番目のURLは、後に&...来URLの一部が欠落している

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'] 
+0

(小文字のタグに注意してください)に違反した文字を正規化し、処理するためのHTMLパーサを使用する方法はありますこれを避けるには?ご回答有難うございます。 – Guddu

+0

@Guddu編集を参照してください。 – salparadise

+0

ありがとうございます。あなたは完全にロック!これは私が進むのを助けるでしょう。しかし、1つの質問。次のコードを実行すると、なぜ[なし]が表示されますか? [EstadoDoc_root.xpath( '// estado')のxのx.textを印刷します。 – Guddu

1

以下の通りです。そのテキストの&&amp;に置き換えてetree.fromstringに渡すと、解析が成功するはずです。
一般に、CDATAセクションにXMLを隠すことは良い考えではありません。これは、それが引き起こす可能性のある問題のほんの一例です。このXMLを生成している当事者に何らかの影響がある場合は、そのXMLを変更してもらうことをお勧めします。 URLをつかむ(または何が必要にこれを変更)するために次に

parser = etree.XMLParser(recover=True) 

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