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?

War es hilfreich?

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.

Ian Blicking stimmt .

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top