13 Stimmen

Beautiful Soup [Python] und die Extraktion von Text in einer Tabelle

Ich bin neu bei Python und auch bei Beatiful Soup! Ich habe von BS gehört. Es soll ein großartiges Werkzeug zum Parsen und Extrahieren von Inhalten sein. Also hier bin ich...:

Ich möchte den Inhalt des ersten td einer Tabelle in einer html Dokument. Zum Beispiel habe ich diese Tabelle

<table class="bp_ergebnis_tab_info">
    <tr>
            <td>
                     This is a sample text
            </td>

            <td>
                     This is the second sample text
            </td>
    </tr>
</table>

Wie kann ich beautifulsoup verwenden, um den Text "Dies ist ein Beispieltext" zu übernehmen? Ich verwende soup.findAll('table' ,attrs={'class':'bp_ergebnis_tab_info'}), um Folgendes zu erhalten die gesamte Tabelle.

Danke... oder sollte ich versuchen, das ganze Zeug mit Perl zu bekommen... womit ich nicht so vertraut bin. Eine andere Lösung wäre eine Regex in PHP.

Siehe das Ziel [1]: http://www.schulministerium.nrw.de/BP/SchuleSuchen?action=799.601437941842&SchulAdresseMapDO=142323

Hinweis: Da die HTML-Datei etwas ungültig ist, müssen wir wohl etwas aufräumen. Das kann eine Menge PHP-Code verursachen - da wir die Aufgabe in PHP lösen wollen. Perl wäre auch eine gute Lösung.

Vielen Dank für einige Hinweise und Ideen für einen Ausgangspunkt null

18voto

psmears Punkte 23659

Suchen Sie zunächst die Tabelle (wie Sie es gerade tun). Verwenden Sie find statt findall gibt das erste Element in der Liste zurück (anstatt eine Liste aller Funde zurückzugeben - in diesem Fall müssten wir eine zusätzliche [0] um das erste Element der Liste zu nehmen):

table = soup.find('table' ,attrs={'class':'bp_ergebnis_tab_info'})

Dann verwenden Sie find wieder, um die erste td :

first_td = table.find('td')

Dann verwenden Sie renderContents() um den textlichen Inhalt zu extrahieren:

text = first_td.renderContents()

... und die Aufgabe ist erledigt (obwohl Sie vielleicht auch die Option strip() um führende und nachgestellte Leerzeichen zu entfernen:

trimmed_text = text.strip()

Das sollte reichen:

>>> print trimmed_text
This is a sample text
>>>

wie gewünscht.

10voto

praveen kedar Punkte 150

Verwenden Sie "text", um Text zwischen "td" zu erhalten.

1) Zuerst Tabelle DOM mit Tag oder ID lesen

soup = BeautifulSoup(self.driver.page_source, "html.parser")
htnm_migration_table = soup.find("table", {'id':'htnm_migration_table'})

2) tbody lesen

tbody = htnm_migration_table.find('tbody')

3) Alle tr aus dem tbody-Tag lesen

trs = tbody.find_all('tr')

4) alle tds mit tr ermitteln

for tr in trs:
      tds = tr.find_all('td')
      for td in tds:
      print(td.text)

1voto

Martin Kosek Punkte 388

Ich finde Beautiful Soup ein sehr effizientes Werkzeug, also lernen Sie es weiter :-) Es ist in der Lage, eine Seite mit ungültigem Markup zu analysieren, also sollte es in der Lage sein, die von Ihnen genannte Seite zu verarbeiten. Vielleicht möchten Sie den Befehl BeautifulSoup(html).prettify() wenn Sie eine gültige neu formatierte Seitenquelle mit gültigem Markup erhalten möchten.

Was Ihre Frage betrifft, so ist das Ergebnis Ihrer ersten soup.findAll(...) ist auch ein Beautiful Soup-Objekt, in dem Sie eine zweite Suche durchführen können, etwa so:

table_soup = soup.findAll('table' ,attrs={'class':'bp_ergebnis_tab_info'})
your_sample_text = table_soup.find("td").renderContents().strip()

print your_sample_text

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X