Python: Как извлечь XML, встроенный в HTML-файл? - PullRequest
0 голосов
/ 27 апреля 2010

У меня есть html-файл со встроенным xml-кодом, исходный код вставлен в lastbin:

<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 ]

1 голос
/ 27 апреля 2010

Попробуйте использовать BeautifulStoneSoup часть библиотеки BeautifulSoup, которая предназначена для XML.

0 голосов
/ 28 апреля 2010

Наконец я обнаружил, что кипаринг - лучшее оружие для выполнения задачи:

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

0 голосов
/ 27 апреля 2010

Ну, я только что попробовал 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"

Вы заметите, что суп изменился Ответ на Ответ

0 голосов
/ 27 апреля 2010

(Тьфу! Почему многие авторы считают, что <textarea> контент не нуждается в экранировании HTML? Дураки!)

К сожалению, BeautifulSoup 3.1 не применяет (неправильное, но распространенное) исправление браузера для обработки символов < и & внутри <textarea> как текста и вместо этого создает настоящие элементы XML.

BeautifulSoup 3.0 справляется, но все в порядке. Почему есть разница.

0 голосов
/ 27 апреля 2010

Возможно, lxml сработает, хотя я сам никогда им не пользовался, поэтому не знаю, насколько легко / сложно было бы делать то, что вы хотите.

...