Beautiful Soup AssertionError - PullRequest
       0

Beautiful Soup AssertionError

1 голос
/ 07 января 2020

Я пытаюсь скрести этот сайт в .CSV и получаю сообщение об ошибке: AssertionError: 9 columns passed, passed data had 30 columns. Мой код приведен ниже, он немного грязный, потому что я экспортировал из Jupyter Notebook.

from urllib.request import Request, urlopen
from bs4 import BeautifulSoup as soup
import pandas as pd

url = 'https://apps.azsos.gov/apps/election/cfs/search/CandidateSearch.aspx'

req = Request(url , headers={'User-Agent': 'Mozilla/5.0'})
html = urlopen(req).read()
soup = BeautifulSoup(html)

type(soup)  # we see that soup is a BeautifulSoup object

column_headers = [th.getText() for th in 
                  soup.findAll('tr', limit=2)[1].findAll('th')]
column_headers # our column headers

data_rows = soup.findAll('th')[2:]  # skip the first 2 header rows

type(data_rows)  # now we have a list of table rows

candidate_data = [[td.getText() for td in data_rows[i].findAll('td')]
            for i in range(len(data_rows))]

df = pd.DataFrame(candidate_data, columns=column_headers)
df.head()  # head() lets us see the 1st 5 rows of our DataFrame by default

df.to_csv(r'C:/Dev/Sheets/Candiate_Search.csv', encoding='utf-8', index=False)

1 Ответ

1 голос
/ 07 января 2020

Данные на странице [screenshot of given url 1] определенно содержат таблицу, и вы анализируете заголовки столбцов и передаете их в CSV. Визуально эта таблица имеет 8 столбцов, но вы анализируете 9 заголовков. На данный момент вам, вероятно, следует go проверить ваши данные, чтобы увидеть, что вы нашли - это может быть не то, что вы ожидаете. Но ладно, вы go и проверьте, и вы видите, что один из них - это пробел столбца в таблице, который будет пустым или мусорным, и вы продолжаете.

Эти строки:

data_rows = soup.findAll('th')[2:]  # skip the first 2 header rows

type(data_rows)  # now we have a list of table rows

candidate_data = [[td.getText() for td in data_rows[i].findAll('td')]
        for i in range(len(data_rows))]

найдите каждый <th> экземпляр на странице, а затем каждый <td> внутри каждого <th>, и это то, где оно действительно сходит с рельсов. Я предполагаю, что вы не веб-разработчик, но таблицы и их подэлементы (строки aka <tr>, заголовки aka <th> и ячейки aka <td>) используются на большинстве страниц для организации множества визуальных элементов и также иногда для организации табличных данных.

Угадайте, что? Вы нашли много таблиц, которые не являются этой визуальной таблицей, потому что вы искали всю страницу для <th> элементов.

Я бы предложил вам предварительно отфильтровать использование всего soup сначала найдя <table> или <div>, который содержит только интересующие вас табличные данные, а затем выполните поиск в этой области.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...