/ / Scraperwiki - python - pomijanie wiersza tabeli - python-2.7, skrobanie w sieci, scraperwiki

Scraperwiki - python - pomijanie wiersza tabeli - python-2.7, web-scraping, scraperwiki

Próbuję zeskrobać stół, który używa TH jakowiodący element kolumny z następującym znacznikiem TD. Problem polega na tym, że tabela wykorzystuje przerywane dzielniki, które należy pominąć, ponieważ nie zawierają znacznika TH.

To jest próbka z tabeli:

<tr><th scope="row">Availability (non-CRS):</th><td></td></tr>
<tr><td colspan="2" class="fieldDivider"><div>&nbsp;</div></td></tr>
<tr><th scope="row">Start Date:</th><td>01 Jun 2012</td></tr>
<tr><th scope="row">Expiry Date:</th><td>31 May 2015</td></tr>
<tr><th scope="row">Duration:</th><td>36 months</td></tr>
<tr><td colspan="2" class="fieldDivider"><div>&nbsp;</div></td></tr>
<tr><th scope="row">Total Value:</th><td>&pound;18,720,000<i>(estimated)</i></td></tr>

Używam pythona w scraperwiki do zbierania danych, ale mam problem z pominięciem niepoprawnego wiersza.

Bez warunkowego kodu mój kod się zatrzymujeDocieram do wiersza bez znacznika TH, więc obecnie używam instrukcji if, aby upewnić się, że skrobanie wykonuję tylko w wierszach bez spacji, ale moja zmienna (dane) nie jest definiowana, więc jeśli instrukcja nie jest poprawnie wykonywana.

To jest mój pierwszy kodowanie poza tutorialem, więc oczekuję, że odpowiedź jest bardzo prosta, po prostu nie jestem pewien, co to jest.

#!/usr/bin/env python

import scraperwiki
import requests
from bs4 import BeautifulSoup

base_url = "http://www.londoncontractsregister.co.uk/public_crs/contracts/contract-048024/"

html = requests.get(base_url)
soup = BeautifulSoup(html.content, "html.parser")

table = soup.findAll("table")
rows = table[0].findAll("tr")


for row in rows:
th_cell = row.findAll("th")
td_cell = row.findAll("td")
if td_cell[0].get_text() == "&nbsp;":
data = {
"description" : th_cell[0].get_text(),
"record" : td_cell[0].get_text()
}

print data

Odpowiedzi:

0 dla odpowiedzi № 1

Trochę szybkiego hakowania (są chyba lepsze sposoby na zrobienie tego), ale jest to oparte na twoim kodzie i wydaje się, że masz to, co myślę, że chcesz; spróbuj pobrać dane i obsłużyć wyjątek, jeśli możemy „t:

data = []

for row in rows:
th_cell = row.findAll("th")
td_cell = row.findAll("td")
try:
data.append({"description": th_cell[0].get_text(),
"record" : td_cell[0].get_text()})
except IndexError:
pass

for item in data:
print data