Использование BeautifulSoup для очистки данных и получения не всех строк - PullRequest
0 голосов
/ 28 апреля 2020

Я новичок в Python и кодирования в целом. Я на 95% там, и код, который я построил, получает только первую строку таблицы из Википедии. Похоже, мне не хватает чего-то незначительного. Я также хотел бы, пожалуйста, помочь. Смотрите код ниже:

from bs4 import BeautifulSoup
import requests
import pandas as pd

    URL_TO = 'https://en.wikipedia.org/wiki/List_of_postal_codes_of_Canada:_M'
    response = requests.get(URL_TO)
    soup = BeautifulSoup(response.text,'html.parser')
    soup.prettify()

    table = soup.find('table', {'class': 'wikitable sortable'}).tbody

    rows = table.find_all('tr')

    columns = [v.text.replace('\n', '') for v in rows[0].find_all('th')]

    df = pd.DataFrame(columns = columns)

    for i in range(1, len(rows)):
        tds = rows[i].find_all('td')

        if len(tds) ==3:
            values= [tds[0].text.replace('\n',''), tds[1].text.replace('\n',''), tds[2].text.replace('\n','')]
        else:
            values = [td.text.replace('\n','') for td in tds]

    df = df.append(pd.Series(values, index=columns), ignore_index=True)

    df.head()

1 Ответ

0 голосов
/ 29 апреля 2020

Вам необходимо включить df.append() в ваши итерации строк. В настоящее время он проходит через вашу итерацию, но не добавляет ее.

Несколько других вещей:

  1. Поскольку вы выполняете итерацию по списку, вам не нужно создавать arange и использовать индексов. Просто используйте for row in rows:
  2. Вместо замены '\n', вы можете использовать .strip(), чтобы удалить пробелы. Это позаботится об этом и о любых дополнительных пробелах
  3. Почему операторы if tds == 3: else:? Не требуется
  4. Поскольку это тег <table>, за которым вы идете, используйте pandas .read_html(). Он делает всю эту работу за вас (используя BeautifulSoup под капотом). Посмотрите этот код ниже

Итак, вот изменения, сделанные для вашего кода. Опять же, единственное, что ДЕЙСТВИТЕЛЬНО нужно было изменить, это отступ df.append

from bs4 import BeautifulSoup
import requests
import pandas as pd

URL_TO = 'https://en.wikipedia.org/wiki/List_of_postal_codes_of_Canada:_M'
response = requests.get(URL_TO)
soup = BeautifulSoup(response.text,'html.parser')
soup.prettify()

table = soup.find('table', {'class': 'wikitable sortable'}).tbody

rows = table.find_all('tr')

columns = [v.text.strip() for v in rows[0].find_all('th')]

df = pd.DataFrame(columns = columns)

for row in rows:
    if row.find_all('td'):
        tds = row.find_all('td')
        values = [td.text.strip() for td in tds]
        df = df.append(pd.Series(values, index=columns), ignore_index=True)

ТОЛЬКО ОДИН РЕЗУЛЬТАТ ИСПОЛЬЗОВАНИЯ PANDAS:

import pandas as pd

url = 'https://en.wikipedia.org/wiki/List_of_postal_codes_of_Canada:_M'
df = pd.read_html(url)[0]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...