刮除表格时出现“列表索引超出范围”的问题

时间:2019-04-06 09:45:18

标签: python web-scraping beautifulsoup

我正在尝试从Wikipedia页面上删除表格 https://en.wikipedia.org/wiki/List_of_postal_codes_of_Canada:_M

我得到了html,找到了包含我想要的表的部分:

<table class="wikitable sortable">
 <tbody>
  <tr>
   <th>Postcode</th>
   <th>Borough</th>
   <th>Neighbourhood</th>
  </tr>
 <tr>
  <td>M1A</td>
  <td>Not assigned</td>
  <td>Not assigned</td>
 </tr>
 <tr>
  <td>M2A</td>
  <td>Not assigned</td>
  <td>Not assigned</td>
 </tr>
  <tr>
   <td>M3A</td>
   <td><a href="/wiki/North_York" title="North York">North York</a></td>
   <td><a href="/wiki/Parkwoods" title="Parkwoods">Parkwoods</a></td>
  </tr>
 <tr>
  <td>M4A</td>
  <td><a href="/wiki/North_York" title="North York">North York</a></td>
  <td><a href="/wiki/Victoria_Village" title="Victoria Village">Victoria Village</a></td>
 </tr>
 <tr>
  <td>M5A</td>
  <td><a href="/wiki/Downtown_Toronto" title="Downtown Toronto">Downtown Toronto</a></td>
  <td><a href="/wiki/Harbourfront_(Toronto)" title="Harbourfront (Toronto)">Harbourfront</a></td>
  </tr>
 <tr>
.
.
.

然后我尝试了以下操作:

PostalCode=[]
for row in My_table.findAll('tr')[1:]:
    PostalCode_cell=row.findAll('td')[0]
    PostalCode.append(PostalCode_cell.text)

print(PostalCode) 

输出是我所期望的:

['M1A', 'M2A', 'M3A', 'M4A', 'M5A', 'M5A', 'M6A', 'M6A', 'M7A', 'M8A', 'M9A', 'M1B', 'M1B', 'M2B', 'M3B', 'M4B', 'M4B', 'M5B', 'M5B', 'M6B', ...

但是,当我想为自治市镇和附近地区做同样的事情时,我总是会得到“列表索引超出范围” 这是我用于自治市镇和社区的代码:

Borough=[]
for row in My_table.findAll('td') :
    Borough_cell=row.findAll('a')[0]
    Borough.append(Borough_cell.text)
print(Borough)
Neighbourhood=[]
for row in My_table.findAll('td'):
    Neighbourhood_cell=row.findAll('a')[1]
    Neighbourhood.append(Neighbourhood_cell.text)
print(Neighbourhood)

我确实注意到在Borough和Neighbourhood中有一个值“ Not Assigned”(没有“ a”),我不知道是否是这些值导致了问题。 我的预期结果是将表格转换为熊猫格式以进行进一步处理。

2 个答案:

答案 0 :(得分:0)

是的,原因是某些邮政编码包含链接,而另一些则没有。

执行此操作的一种更简单的方法是仅获取window.location.href = '{{ route('show-all-prescription')}}"; (用于自治市镇/社区)并将文本输入其中:

td

就像您对邮政编码所做的一样。

请注意,您现在可以将代码概括为一个for循环:

Borough=[]
for row in My_table.findAll('tr')[1:]:
    Borough_cell=row.findAll('td')[1]
    Borough.append(Borough_cell.text)
print(Borough)

此外,如果您的项目涉及许多Wikipedia页面和大量的抓取/分析,那么我强烈建议您使用以下两种资源:

  1. Wikipedia's API并获得here的帮助。
  2. mwparserfromhell,一个漂亮的软件包,可帮助解析一堆MediaWiki对象。

答案 1 :(得分:0)

您还可以使用 pandas.read_html() 将表直接转换为 DataFrame

import pandas as pd
df_list=pd.read_html('https://en.wikipedia.org/wiki/List_of_postal_codes_of_Canada:_M')
print(df_list[0])

输出:

    Postcode           Borough                                      Neighbourhood
0        M1A      Not assigned                                       Not assigned
1        M2A      Not assigned                                       Not assigned
2        M3A        North York                                          Parkwoods
3        M4A        North York                                   Victoria Village
4        M5A  Downtown Toronto                                       Harbourfront
5        M5A  Downtown Toronto                                        Regent Park
...
[288 rows x 3 columns]