BeautifulSoup 3.1 파서가 너무 쉽게 파손됩니다
-
19-08-2019 - |
문제
나는 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도 있습니다.
Google App Engine에 있거나 순전히 Python이 허용되지 않는 경우 더 이상 BeautifulSoup을 사용할 이유가 없습니다.