Веб-скрейпинг с помощью Python: ошибка NoneType, невозможно очистить данные таблицы

это моя первая попытка кодирования, поэтому, пожалуйста, простите мою глупость. Я пытаюсь изучить веб-скрапинг, практикуясь по этой ссылке: https://data.gov.sg/dataset/industrial-arbitration-court-awards-by-nature-of-trade-disputes?view_id=d3e444ef-54ed-4d0b-b715-1ee465f6d882&resource_id=c24d0d00-2d12-4f68-8fc9-4121433332e0

Я честно потратил часы, пытаясь понять, что не так с моим кодом здесь:

import csv
import requests
from BeautifulSoup import BeautifulSoup

url = 'https://data.gov.sg/dataset/industrial-arbitration-court-awards-by-nature-of-trade-disputes?view_id=d3e444ef-54ed-4d0b-b715-1ee465f6d882&resource_id=c24d0d00-2d12-4f68-8fc9-4121433332e0'
response = requests.get(url)
html = response.content

soup = BeautifulSoup(html)
table = soup.find('tbody')

list_of_rows = []
for row in table.find('tr'):
    list_of_cells = []
    for cell in row.findAll('td'):
        list_of_cells.append()
    list_of_rows.append(list_of_cells)

outfile = open("./indarb.csv","wb")
writer = csv.writer(outfile)

Затем мой терминал выдает это: объект «NoneType» не имеет атрибута «найти», говоря, что в строке 13 есть ошибка. Не уверен, что это помогает в запросах, но это список того, что я пробовал:

Различные перестановки «найти»/«найтивсе»

  • Вместо «.find» используется «.findAll».
  • Вместо «.findAll» используется «.find»

Различные перестановки для строки 10

  • Попробовал суп.найти('tbody')
  • Пробовал суп.найти('стол')
  • Открытый исходный код, попробовал soap.find('table', attrs={'class':'table table-уплотненный'})

Различные перестановки для строки 13

  • аналогично пробовал только с тегом 'tr'; или
  • пытался добавить материал 'attrs={}'

Я действительно пытался, но не могу понять, почему я не могу очистить эту простую таблицу из 10 строк. Если бы кто-нибудь мог опубликовать код, который работает, это было бы феноменально. Спасибо за ваше терпение!


person mxcodes    schedule 09.07.2016    source источник
comment
Вы действительно смотрели в своем браузере или на то, какие запросы возвращаются, чтобы увидеть, что вы получаете с этим URL-адресом?   -  person Padraic Cunningham    schedule 10.07.2016
comment
@PadraicCunningham: я прошу прощения за эту ошибку, это должно быть url = 'data.gov.sg/dataset/' Даже после этого проблема остается произошло.   -  person mxcodes    schedule 11.07.2016


Ответы (2)


URL-адрес, который вы запрашиваете в своем коде, — это не HTML, а JSON.

person Ugo T.    schedule 09.07.2016
comment
А, вижу, спасибо большое! Извините, все еще пытаюсь понять, что означают все эти термины. - person mxcodes; 11.07.2016

У вас есть несколько ошибок, самая большая из них — вы используете BeautifulSoup3, который не разрабатывался годами, вам следует использовать bs4, вам также нужно использовать find_all, если вы хотите использовать несколько тегов. Также вы не передали ячейку list_of_cells.append() в строке 13, так что это является причиной вашей другой ошибки:

from bs4 import BeautifulSoup

url = 'https://data.gov.sg/dataset/industrial-arbitration-court-awards-by-nature-of-trade-disputes?view_id=d3e444ef-54ed-4d0b-b715-1ee465f6d882&resource_id=c24d0d00-2d12-4f68-8fc9-4121433332e0%27'
response = requests.get(url)
html = response.content

soup = BeautifulSoup(html)
table = soup.find('table')

list_of_rows = []
for row in table.find_all('tr'):
    list_of_cells = []
    for cell in row.find_all('td'):
        list_of_cells.append(cell)
    list_of_rows.append(list_of_cells)

Я не уверен, что именно вы хотите, но это добавляет tds из первой таблицы на странице. Также есть и api, который вы можете использовать, и загружаемый CSV-файл, если вам действительно нужны данные.

person Padraic Cunningham    schedule 11.07.2016