我正在尝试将该网站抓取为.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)

最佳答案

页面上的数据[肯定有一个表,您解析出列标题并将其传递给CSV。可视地,该表具有8列,但是您解析了9个标题。此时,您可能应该检查数据以查看所发现的内容-可能不是您所期望的。但是,好的,您去检查,发现其中之一是表中的空白列,该列将为空或垃圾,然后继续。

这些行:

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>

关于python - BeautifulSoup AssertionError,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59634423/

10-14 01:12