Python:如何提取嵌入在html文件中的xml?

时间:2010-04-26 22:26:49

标签: python xml screen-scraping

我有一个嵌入了xml snlick的html文件,源代码粘贴在pastbin中:

<html>
  <head>
    <title> test֤</title>
  </head>
  <body>
    <form name="acsForm" action="" method="post" >
      <textarea rows=10 cols=80 name="xmlText"><?xml version="1.0" encoding="UTF-8"?>
        <samlp:Response xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol">
        </samlp:Response> 
      </textarea>
      <textarea name="2nd"> text2....</textarea>             
    </form>
  </body>
</html>

我的任务是从HTML中提取第一个textarea中包含的文本,这是一个XML片段。没有对原始代码段进行任何更改。我可以通过使用BeautifulSoup来获取它,但它将所有标记名称更改为小写。

5 个答案:

答案 0 :(得分:1)

尝试使用专为XML设计的BeautifulSoup库的BeautifulStoneSoup部分。

答案 1 :(得分:0)

也许lxml会起作用,虽然我自己从未使用它,所以我不知道做你想做的事情会有多么容易/复杂。

答案 2 :(得分:0)

(唉!为什么这么多作者似乎认为<textarea>内容不需要HTML转义?傻瓜!)

不幸的是,BeautifulSoup 3.1没有应用(错误但常见的)浏览器修复,将<内的&<textarea>字符视为文本,而是创建真正的XML元素。 / p>

BeautifulSoup 3.0可以应对它。 Why there's a difference.

答案 3 :(得分:0)

我刚刚尝试过beautifulSoup 3.0,它对我不起作用:

xml ='<samlp:Response xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"></samlp:Resonse>'
print BeautifulSoup.BeautifulStoneSoup(xml)
<samlp:response xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"

您会注意到汤已经响应更改为响应

答案 4 :(得分:0)

最后我发现pyparsing是完成任务的最佳武器:

aStart,aEnd = makeHTMLTags(“textarea”)

search = aStart + SkipTo(aEnd)(“body”)+ aEnd

saml_resp_str = search.searchString(doc)[0] .body relay_state_str = search.searchString(doc)[1] .body