문제

나는 BeautifulSoup과 함께 dodgy html을 파싱하는 데 어려움을 겪고있었습니다. 최신 버전으로 사용되는 HTMLPARSER는 이전에 사용한 SGMLPARSER보다 덜 관대합니다.


BeautifulSoup에는 일종의 디버그 모드가 있습니까? 나는 끔찍한 html에서 그것을 막는 방법을 알아 내려고 노력하고 있습니다. 나는 게비 웹 사이트에서로드하고 있습니다.

<HTML>
    <HEAD>
        <TITLE>Title</TITLE>
        <HTTP-EQUIV="PRAGMA" CONTENT="NO-CACHE">
    </HEAD>
    <BODY>
        ...
        ...
    </BODY>
</HTML>

BeautifulSoup은 다음을 포기합니다 <HTTP-EQUIV...> 꼬리표

In [1]: print BeautifulSoup(c).prettify()
<html>
 <head>
  <title>
   Title
  </title>
 </head>
</html>

문제는 분명히 HTTP-equiv 태그입니다. 매우 흉하게 생긴 <META HTTP-EQUIV="PRAGMA" CONTENT="NO-CACHE"> 꼬리표. 분명히, 나는 이것을 자체 폐쇄로 지정해야하지만, 내가 지정한 내용에 관계없이 그것을 고칠 수 없다.

In [2]: print BeautifulSoup(c,selfClosingTags=['http-equiv',
                            'http-equiv="pragma"']).prettify()
<html>
 <head>
  <title>
   Title
  </title>
 </head>
</html>

BeautifulSoup이 무엇을하고 있는지 말해 줄 장점 디버그 모드가 있으므로이 경우 태그 이름으로 취급하는 것이 무엇인지 알아낼 수 있습니까?

도움이 되었습니까?

해결책

당신의 문제는 다른 것이어야합니다. 그것은 나에게 잘 작동합니다 :

In [1]: import BeautifulSoup

In [2]: c = """<HTML>
   ...:     <HEAD>
   ...:         <TITLE>Title</TITLE>
   ...:         <HTTP-EQUIV="PRAGMA" CONTENT="NO-CACHE">
   ...:     </HEAD>
   ...:     <BODY>
   ...:         ...
   ...:         ...
   ...:     </BODY>
   ...: </HTML>
   ...: """

In [3]: print BeautifulSoup.BeautifulSoup(c).prettify()
<html>
 <head>
  <title>
   Title
  </title>
  <http-equiv>
  </http-equiv>
 </head>
 <body>
  ...
        ...
 </body>
</html>


In [4]: 

이것은 BeautifulSoup 3.0.7a의 Python 2.5.2입니다. 이전/새로운 버전에서는 다를 수 있습니까? 이것은 정확히 아름답게 처리하는 수프의 종류이기 때문에 어느 시점에서 그것이 바뀌 었다고 의심합니다 ... 문제에서 언급하지 않은 구조에 다른 것이 있습니까?

다른 팁

아름다운 수프 3.1.0에 문제가 있습니까? 사용하는 것이 좋습니다 html5lib의 파서는 해결 방법 중 하나입니다.

#!/usr/bin/env python
from html5lib import HTMLParser, treebuilders

parser = HTMLParser(tree=treebuilders.getTreeBuilder("beautifulsoup"))

c = """<HTML>
    <HEAD>
        <TITLE>Title</TITLE>
        <HTTP-EQUIV="PRAGMA" CONTENT="NO-CACHE">
    </HEAD>
    <BODY>
        ...
        ...
    </BODY>
</HTML>"""

soup = parser.parse(c)
print soup.prettify()

산출:

<html>
 <head>
  <title>
   Title
  </title>
 </head>
 <body>
  <http-equiv="pragma" content="NO-CACHE">
   ...
        ...
  </http-equiv="pragma">
 </body>
</html>

출력은 HTML5LIB 가이 경우 문제를 해결하지 않았 음을 보여줍니다.

노력하다 LXML (및 HTML 모듈). 그 이름에도 불구하고, 그것은 또한 HTML을 구문 분석하고 긁는 것입니다. BeautifulSoup보다 훨씬 빠르며 BeautifulSoup보다 "부러진"HTML을 더 잘 처리합니다. LXML API를 배우고 싶지 않다면 BeautifulSoup의 호환 API도 있습니다.

Ian Blicking은 동의합니다.

Google App Engine에 있거나 순전히 Python이 허용되지 않는 경우 더 이상 BeautifulSoup을 사용할 이유가 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top