Как и пример потерянного примера кода, найденного в Интернете, этот код не является кодом производственного уровня - он слепо предполагает, что запросы http всегда выполняются успешно, и возвращает ожидаемое содержимое.Правда в том, что это не так часто (сетевые ошибки, прокси или брандмауэр блокируют вас, сайт отключен - временно или определенно, обновления на сайте, которые изменили либо URL-адреса и / или разметку страницы и т. Д.).
Ваша проблема проявляется здесь:
def table_to_df(table):
return pd.DataFrame([[td.text for td in row.findAll('td')] for row in table.tbody.findAll('tr')])
и происходит от table
на самом деле None
, что означает, что здесь в цикле for:
table = soup.find(name='table', attrs={'id':'tableID'})
не былотег "table" с идентификатором "tableID" найден в HTML-документе.Вы можете проверить это, напечатав фактическое содержание HTML:
while True:
print(counter)
page = requests.get(url)
soup = bs4.BeautifulSoup(page.content, 'lxml')
table = soup.find(name='table', attrs={'id':'tableID'})
if table is None:
print("no table 'tableID' found for url {}".format(url))
print("html content:\n{}\n".format( page.content))
continye
# etc