neolee / wop-community

29 stars 19 forks source link

实操案例二数据抓取问题 #307

Closed wang-yulin closed 3 years ago

wang-yulin commented 3 years ago

我在抓取香港太空馆亮星数据的时候,先把所有页面的Table抓取并放进了tables变量里面。然后尝试遍历所有Table抓取每一个单元格的数据,出现了如下错误。但是我尝试直接打印如下代码中的row的时候,没有出现任何问题。

我的疑惑是既然能打印,那执行其他操作应该也没有问题啊,还请老师帮忙看看哪个环节出了问题呢。

for table in tables:
    for tr in table.tbody.find_all('tr')[1:]:
        row = []
        for td in tr.find_all('td'):
            row.append(td.text)
        rows.append(row)

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-217-3f129b54d8ae> in <module>
      1 rows = []
      2 for table in tables:
----> 3     for tr in table.tbody.find_all('tr')[1:]:
      4         row = []
      5         for td in tr.find_all('td'):

AttributeError: 'NoneType' object has no attribute 'tbody'

for table in tables:
    for tr in table.tbody.find_all('tr')[1:]:
        row = []
        for td in tr.find_all('td'):
            row.append(td.text)
        print(row)

[' Acamar *', ' q', ' Eri', ' 天 园 六', ' 2.91', ' -']
[' Achernar **', ' a', ' Eri', ' 水 委 一', ' 0.46', ' -']
[' Achird', ' h', ' Cas', ' 王 良 三', ' 3.6', ' d']
[' Acrab', ' b', ' Sco', ' 房 宿 四', ' 2.55', ' d']
[' Acrux **', ' a', ' Cru', ' 十 字 架 二', ' 0.79', ' d']
[' Acubens *', ' a', ' Cnc', ' 柳 宿 增 三', ' 4.3', ' -']
[' Adara', ' e', ' CMa', ' 弧 矢 七', ' 1.5', ' -']
...
wang-yulin commented 3 years ago

找到原因了,原来是Q那个页面没有table,所有遍历到那就会出现如上的问题,打印只是打印了Q之前的页面... ...

neolee commented 3 years ago

Q 页面空的么?我做的时候好像没遇到这问题呀。

wang-yulin commented 3 years ago

Q 页面空的么?我做的时候好像没遇到这问题呀。

嗯,这个页面没有table,我在遍历爬回来的table的时候,加了句if table:做判断就搞定了 https://www.lcsd.gov.hk/CE/Museum/Space/zh_CN/web/spm/starshine/resources/constemyth/chinengstars/startable17.html

neolee commented 3 years ago

我的代码里用 for table in soup.find('div', id='article').find_all('table'): 来循环,要是没有 <table> 标签,应该就不会进入循环体,按理不会有异常呀。

wang-yulin commented 3 years ago

我发现了我跟老师找<table>标签的逻辑不一样,下面是我的代码,而且用我这个逻辑的话,A页面只能抓到第一个表格。


tables = []
for page in pages:
    res = requests.get(url=page)
    payload = res.content
    soup = BeautifulSoup(payload, 'html.parser')
    table = soup.find('table', class_='table_space')
    tables.append(table)
tables
neolee commented 3 years ago

你这个方法没用到 bs4 提供的好用的 find_all,试试呗

wang-yulin commented 3 years ago

你这个方法没用到 bs4 提供的好用的 find_all,试试呗

嗯,用上了find_all,这下真正解决了开始那个问题。