проблема с индексом списка вне диапазона при очистке таблицы - PullRequest
1 голос
/ 06 апреля 2019

Я пытаюсь записать таблицу со страницы википедии 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)

Я заметил, что в Боро и Соседстве есть значение «Не назначено» (у которого нет «а»), я не знаю, являются ли эти значения причиной проблемы. Мой ожидаемый результат - перевести таблицу в формат панд для дальнейшей обработки.

Ответы [ 2 ]

0 голосов
/ 06 апреля 2019

Вы также можете использовать 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]
0 голосов
/ 06 апреля 2019

Да, причина в том, что некоторые почтовые индексы имеют ссылку, а другие нет.

Более простой способ сделать это - просто взять 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. API Википедии с некоторой помощью здесь .
  2. mwparserfromhell , красивый пакет, который помогает анализировать кучу объектов MediaWiki.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...