BeautifulSoup - lxml und html5lib Parser Schaben Unterschiede

Ich bin mit BeautifulSoup 4 mit Python 2.7. Ich möchte zum extrahieren bestimmter Elemente aus einer website (Mengen, siehe das Beispiel unten). Für einige Grund, die lxml parser erlaubt mir nicht, zu extrahieren alle gewünschten Elemente von der Seite. Es würde drucken Sie die ersten drei Elemente. Ich bin versucht, die html5lib parser, um zu sehen, wenn ich zu extrahieren, können Sie alle von Ihnen.

Die Seite enthält mehrere Elemente, mit deren Preis und Mengen. Ein Teil des Codes, der die gewünschten Informationen für jedes Element wie folgt aussieht:

<td class="size-price last first" colspan="4">
                    <span>453 grams </span>
            <span> <span class="strike">$619.06</span> <span class="price">$523.91</span>
                    </span>
                </td>

Wir betrachten die folgenden drei Fälle:

FALL 1 - DATEN:

#! /usr/bin/python
from bs4 import BeautifulSoup
data = """
<td class="size-price last first" colspan="4">
                    <span>453 grams </span>
            <span> <span class="strike">$619.06</span> <span class="price">$523.91</span>
                    </span>
                </td>"""                
soup = BeautifulSoup(data)
print soup.td.span.text

Drucke:

453 grams 

FALL 2 - LXML:

#! /usr/bin/python
from bs4 import BeautifulSoup
from urllib import urlopen
webpage = urlopen('The URL goes here')
soup=BeautifulSoup(webpage, "lxml")
print soup.find('td', {'class': 'size-price'}).span.text

Drucke:

453 grams

FALL 3 - HTML5LIB:

#! /usr/bin/python
from bs4 import BeautifulSoup
from urllib import urlopen
webpage = urlopen('The URL goes here')
soup=BeautifulSoup(webpage, "html5lib")
print soup.find('td', {'class': 'size-price'}).span.text

Bekomme ich die folgende Fehlermeldung:

Traceback (most recent call last):
  File "C:\Users\Dom\Python-Code\src\Testing-Code.py", line 6, in <module>
    print soup.find('td', {'class': 'size-price'}).span.text
AttributeError: 'NoneType' object has no attribute 'span'

Wie muss ich mich anpassen, mein code, um zu extrahieren die Informationen, die ich will mit der html5lib-parser? Ich kann sehen, dass Sie alle gewünschten Informationen, wenn ich drucken Sie einfach die Suppe in der Konsole nach der Verwendung der html5lib, so dass ich dachte, es würde mir erlauben, zu bekommen, was ich will. Es ist nicht der Fall für die lxml-parser, so bin ich auch neugierig auf die Tatsache, dass die lxml-parser nicht scheinen, um zu extrahieren alle Mengen mit der lxml-parser, wenn ich:

print [td.span.text for td in soup.find_all('td', {'class': 'size-price'})]
  • html5lib lässt die td tag und legt alles in das html-body - dies ist, weil es keine table tag rund um die td und html5lib ist besorgt über es.
  • Interessant, so nun wie muss ich Vorgehen, um Sie zu extrahieren Sie die Elemente, die ich will mit html5lib
  • Gut, warum Sie verwenden möchten html5lib? FYI, können Sie auch Gebrauch machen von html.parser, z.B.: BeautifulSoup(webpage, 'html.parser').
  • RuntimeWarning: Python ' s built-in HTMLParser kann nicht analysieren das gegebene Dokument. Ist dies nicht ein bug in der Schönen Suppe. Die beste Lösung ist die Installation eines externen parser (lxml oder html5lib), und verwenden Sie Schöne Suppe mit, dass parser. Siehe crummy.com/software/BeautifulSoup/bs4/doc/#installing-a-parser für die Hilfe. "Python's built-in HTMLParser cannot parse the given document. This is not a bug in Beautiful Soup. The best solution is to install an external parser (lxml or html5lib), and use Beautiful Soup with that parser.
  • Gotcha 🙂 Kann ich sehen, wie das ganze html-Dokument (oder einen link), die Sie versuchen zu analysieren?
  • Ich würde lieber privat halten, wenn Sie nichts dagegen haben. Ich weiß, es kann nicht wirklich viel helfen, wenn ich nicht geben Sie die entsprechende URL... sagen wir mal ich benutze REGEX kompilieren Sie die Preise soup=BeautifulSoup(webpage, "lxml") FindPrice = re.compile('\$\d+\.\d{2}') print re.findall(FindPrice, str(soup)) Es nicht drucken alle Preise auf der Seite. Mit html5lib wird. Gleiche Sache mit den quanitities. Dies ist der Grund, warum, den ich nutzen möchte html5lib. Ich bin gerade auf der Suche nach einem Weg zu verwenden, BeautifulSoup mit html5lib wie ich mit lxml da kratzen mit REGEX ist nicht zu empfehlen...

InformationsquelleAutor LaGuille | 2014-03-27
Schreibe einen Kommentar