Frage an beautifulsoup, python – Python beautifulsoup iterieren über Tabelle

12

Ich versuche, Tabellendaten in eine CSV-Datei zu kratzen. Leider habe ich eine Straßensperre getroffen und der folgende Code wiederholt einfach den TD aus dem ersten TR für alle nachfolgenden TRs.

<code>import urllib.request
from bs4 import BeautifulSoup

f = open('out.txt','w')

url = "http://www.international.gc.ca/about-a_propos/atip-aiprp/reports-rapports/2012/02-atip_aiprp.aspx"
page = urllib.request.urlopen(url)

soup = BeautifulSoup(page)

soup.unicode

table1 = soup.find("table", border=1)
table2 = soup.find('tbody')
table3 = soup.find_all('tr')

for td in table3:
    rn = soup.find_all("td")[0].get_text()
    sr = soup.find_all("td")[1].get_text()
    d = soup.find_all("td")[2].get_text()
    n = soup.find_all("td")[3].get_text()

    print(rn + "," + sr + "," + d + ",", file=f)
</code>

Dies ist mein erstes Python-Skript, für jede Hilfe wäre ich dankbar! Ich habe andere Fragen beantwortet, kann aber nicht herausfinden, was ich hier falsch mache.

Deine Antwort

2   die antwort
6

dass Sie jedes Mal, wenn Sie versuchen, Ihre Suche einzugrenzen (erhalten Sie das erste td in diesem tr, usw.), Sie stattdessen nur zurückrufen, um Suppe. Suppe ist das oberste Objekt - es repräsentiert das gesamte Dokument. Sie müssen die Suppe nur einmal aufrufen und dann das Ergebnis anstelle der Suppe für den nächsten Schritt verwenden.

Zum Beispiel (mit Variablennamen geändert, um klarer zu sein),

<code>table = soup.find('table', border=1)
rows = table.find_all('tr')

for row in rows:
    data = row.find_all("td")
    rn = data[0].get_text()
    sr = data[1].get_text()
    d = data[2].get_text()
    n = data[3].get_text()

    print(rn + "," + sr + "," + d + ",", file=f)
</code>

Ich bin mir nicht sicher, ob print die beste Methode ist, um das zu tun, was Sie hier versuchen (zumindest sollten Sie Zeichenfolgenformatierung anstelle von Addition verwenden), aber ich lasse es so, wie es ist, weil es nicht die ist Kernproblem.

Zur Vervollständigung:soup.unicode werde nichts tun. Sie rufen dort keine Methode auf, und es gibt keine Zuweisung. Ich erinnere mich nicht, dass BeautifulSoup eine Methode mit dem Namen Unicode hatte, aber ich bin an BS 3.0 gewöhnt, sodass sie in 4 möglicherweise neu ist.

35

tsfind() oderfind_all()Wenn Sie beispielsweise nach allen "td" -Tags fragen, erhalten Sie alle "td" -Tagsim Dokument, nicht nur die in der Tabelle und Zeile, nach denen Sie gesucht haben. Sie können genauso gut nicht nach diesen suchen, da sie nicht so verwendet werden, wie Ihr Code geschrieben ist.

Ich denke, Sie möchten so etwas tun:

<code>table1 = soup.find("table", border=1)
table2 = table1.find('tbody')
table3 = table2.find_all('tr')
</code>

Oder, wie Sie wissen, etwas Ähnliches mit aussagekräftigeren Variablennamen:

<code>rows = soup.find("table", border=1).find("tbody").find_all("tr")

for row in rows:
    cells = row.find_all("td")
    rn = cells[0].get_text()
    # and so on
</code>

Verwandte Fragen