gpt4 book ai didi

python - 抓取表时出现“列表索引超出范围”问题

转载 作者:太空宇宙 更新时间:2023-11-03 21:03:58 25 4
gpt4 key购买 nike

我正在尝试从维基百科页面抓取表格 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)

我确实注意到,在自治区和邻里有值“未分配”(没有“a”),我不知道是否是这些值导致了问题。我的预期结果是将表转换为 pandas 格式以供进一步处理。

最佳答案

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

更简单的方法是获取自治市/社区的 td 并获取其中的文本:

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

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

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

postcodes = []
boroughs = []
neighbourhoods = []
for row in My_table.findAll('tr')[1:]:
postcodecell, boroughcell, neighbourcell = row.findAll('td')
postcodes.append(postcodecell.text)
boroughs.append(boroughcell.text)
neighbourhoods.append(neighbourcell.text)
<小时/>

此外,如果您的项目涉及大量维基百科页面和大量抓取/解析,那么我强烈向您推荐两个资源:

  1. Wikipedia's API在一些帮助下here .
  2. mwparserfromhell ,一个漂亮的包,可以帮助解析一堆 MediaWiki 对象。

关于python - 抓取表时出现“列表索引超出范围”问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55547822/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com