Я исследовал проблему и попробовал несколько фрагментов на своем ноутбуке.
Проблема не в DataFrame , так как вы читаете каждую строку за раз в цикле, проблема в URL, ваша программа правильно удаляет страницу, содержащую таблицу, и выдает ошибка для почтового индекса, который не имеет элемента.
Рассмотрим первый тест:
Я создал HTML-страницу без таблицы:
<html>
<head>
<title>Demo page</title>
</head>
<body>
<h2>Demo without table</h2>
</body>
</html>
А потом я выполнил код на python, как показано ниже:
from bs4 import BeautifulSoup
data = open('table.html').read()
parser = BeautifulSoup(data, 'html.parser')
table = parser.find('table')
rows = table.find_all('tr')
print(rows)
Вышеупомянутый код остановлен из-за исключение NoneType , поскольку parser.find () возвращает объект NoneType , если элемент таблицы не найден в данных html. Так что find_all () не является методом объекта NoneType, поэтому выдает ошибку.
Итак, я изменил свой HTML-код, как показано ниже:
<html>
<head>
<title>Demo page</title>
</head>
<body>
<h2>Demo without table</h2>
<table>
<tr>Demo</tr>
</table>
</body>
</html>
Теперь код Python работает без каких-либо исключений, так как присутствует элемент таблицы.
Итак, вывод:
Исключением является то, что один из почтовых индексов в кадре данных приводит к URL-адресу, который не содержит таблицы. Итак, я рекомендую вам внести небольшое изменение в ваш код:
scraped_data = []
for x, row in postcodes_for_urls.iterrows():
page = requests.get("http://myurl"+(row['postcode_URL']))
soup = BeautifulSoup(page.content, 'html.parser')
table = soup.find('table')
#add this :
if table == None :
continue
table_rows = table.find_all('tr')
for tr in table_rows:
td = tr.find_all('td')
row = [tr.text for tr in td]
scraped_data.append(row)
pd.DataFrame (scraped_data, columns = ["A", "B", "C"])