BeautifulSoup 3.1 Parser bricht zu weit leicht
-
19-08-2019 - |
Frage
Ich habe Schwierigkeiten, etwas zwielichtigen HTML mit BeautifulSoup Parsen. Es stellte sich heraus, dass die HTMLParser in neueren Versionen verwendet wird, weniger tolerant als die SGMLParser zuvor verwendet.
Hat BeautifulSoup haben eine Art von Debug-Modus? Ich versuche, herauszufinden, wie man es auf einigen bösen HTML Borking zu stoppen ich von einer mürrischen Webseite bin Laden:
<HTML>
<HEAD>
<TITLE>Title</TITLE>
<HTTP-EQUIV="PRAGMA" CONTENT="NO-CACHE">
</HEAD>
<BODY>
...
...
</BODY>
</HTML>
BeautifulSoup aufgibt nach dem <HTTP-EQUIV...>
Tag
In [1]: print BeautifulSoup(c).prettify()
<html>
<head>
<title>
Title
</title>
</head>
</html>
Das Problem ist eindeutig der http-equiv-Tag, das ist wirklich ein sehr malformed <META HTTP-EQUIV="PRAGMA" CONTENT="NO-CACHE">
Tag. Offensichtlich muss ich dies als selbstschließend spezifizieren, aber egal, was ich geben kann ich es nicht beheben:
In [2]: print BeautifulSoup(c,selfClosingTags=['http-equiv',
'http-equiv="pragma"']).prettify()
<html>
<head>
<title>
Title
</title>
</head>
</html>
Gibt es einen ausführlichen Debug-Modus, in der BeautifulSoup mir sagen, was es tut, so kann ich herausfinden, was sie als den Tag-Name in diesem Fall ist die Behandlung?
Lösung
Ihr Problem muss etwas anderes sein; es funktioniert gut für mich:
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]:
Dies ist Python 2.5.2 mit BeautifulSoup 3.0.7a - vielleicht anders ist es bei älteren / neueren Versionen? Dies ist genau die Art von Suppe BeautifulSoup Griffe so schön, so bezweifle ich, es an einem gewissen Punkt geändert worden ist ... Gibt es noch etwas an die Struktur, die Sie nicht in dem Problem erwähnt?
Andere Tipps
Probleme mit Schöner Suppe Mit 3.1.0? empfiehlt verwenden html5lib 's-Parser als eine der Abhilfen.
#!/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()
Ausgabe:
<html>
<head>
<title>
Title
</title>
</head>
<body>
<http-equiv="pragma" content="NO-CACHE">
...
...
</http-equiv="pragma">
</body>
</html>
Die Ausgabe zeigt, dass html5lib allerdings nicht das Problem in diesem Fall festgelegt hat.
Versuchen Sie lxml (und seine HTML-Modul). Trotz seines Namens ist es auch für das Parsen und HTML Schaben. Es ist viel, viel schneller als BeautifulSoup, und es Griffe sogar „gebrochen“ HTML besser als BeautifulSoup. Es hat eine Kompatibilität API für BeautifulSoup auch, wenn Sie nicht die lxml API lernen wollen.
Es gibt keinen Grund BeautifulSoup mehr zu verwenden, es sei denn, Sie sind auf Google App Engine oder etwas, wo etwas nicht rein Python ist nicht erlaubt.