#python #string #web-scraping
Вопрос:
Я пытаюсь изучать науку о данных с помощью python в simplilearn. в разделе обучения matplotlib они выполняют веб-очистку отсюда.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
from urllib.request import urlopen
from bs4 import BeautifulSoup
import re
url="https://www.hubertiming.com/results/2018MLK" #OPEN LINK
html=urlopen(URL)
soup=BeautifulSoup(html,"lxml")
title = soup.title
print (title)
print(title.text)
links = soup.find_all('a',href=True)
for link in links:
print (link['href'])
data =[]
allrows=soup.find_all("tr")
for row in allrows:
row_list = row.find_all("td")
dataRow=[]
data_converted = []
for cell in row_list:
dataRow.append(cell.text)
data.append(dataRow)
data=data[4:]
print(data[-2:])
И вот каковы результаты
[['190', '2087', 'rnrn LEESHA POSEYrnrn ', 'F', '43', 'PORTLAND', 'OR', '1:33:53', '30:17', 'rnrn 112 of 113rnrn ', 'F 40-54', 'rnrn 36 of 37rnrn ', '0:00', '1:33:53'], ['191', '1216', 'rnrn ZULMA OCHOArnrn ', 'F', '40', 'GRESHAM', 'OR', '1:43:27', '33:22', 'rnrn 113 of 113rnrn ', 'F 40-54', 'rnrn 37 of 37rnrn ', '0:00', '1:43:27']]
как я могу избавиться rnrn
от этого ?? я уже использую "replace"
функцию, и она говорит "'list' object has no attribute 'replace'"
, а также я тоже не могу использовать полосу.
Ответ №1:
У вас есть 2D-список
Что мы используем:
- Понимание списка
strip()
метод- Вот и все 🙂
Используйте приведенный ниже код:
text = [['190', '2087', 'rnrn LEESHA POSEYrnrn ', 'F', '43', 'PORTLAND', 'OR', '1:33:53', '30:17', 'rnrn 112 of 113rnrn ', 'F 40-54', 'rnrn 36 of 37rnrn ', '0:00', '1:33:53'], ['191', '1216', 'rnrn ZULMA OCHOArnrn ', 'F', '40', 'GRESHAM', 'OR', '1:43:27', '33:22', 'rnrn 113 of 113rnrn ', 'F 40-54', 'rnrn 37 of 37rnrn ', '0:00', '1:43:27']]
result = [[j.strip() for j in i] for i in text]
print(result)
Выход:
[['190', '2087', 'LEESHA POSEY', 'F', '43', 'PORTLAND', 'OR', '1:33:53', '30:17', '112 of 113', 'F 40-54', '36 of 37', '0:00', '1:33:53'], ['191', '1216', 'ZULMA OCHOA', 'F', '40', 'GRESHAM', 'OR', '1:43:27', '33:22', '113 of 113', 'F 40-54', '37 of 37', '0:00', '1:43:27']]
Ответ №2:
Вы можете сделать только это. преобразовать: cell.text
cell.text.strip()
в ваш код, как показано ниже:
...
for row in allrows:
row_list = row.find_all("td")
dataRow=[]
data_converted = []
for cell in row_list:
dataRow.append(cell.text.strip())
...
Ответ №3:
- Этот веб-сайт имеет четко определенные теги таблиц. Таким образом, проще всего использовать решение
pandas.read_html
, которое приведет к тому, что все таблицы будут сведены в список кадров данных.- Если в html нет тегов таблиц, то
.read_html()
работать не будет.
- Если в html нет тегов таблиц, то
- Поскольку это правильно считывает таблицы, нет дополнительных escape-кодов для удаления или удаления, но если бы это требовалось для столбца данных, что-то вроде
df.Name = df.Name.str.strip()
илиdf.Name = df.Name.str.replace('r', '')
сработало бы. - Это дает преимущество в том, что код сокращается до двух строк, и данными будет легче манипулировать, анализировать и строить графики
import pandas as pd
url = 'https://www.hubertiming.com/results/2018MLK'
# read the tables
df_list = pd.read_html(url)
# in this case the desired dataframe is at index 1
df = df_list[1]
# display(df.head())
Place Bib Name Gender Age City State Chip Time Chip Pace Gender Place Age Group Age Group Place Time to Start Gun Time
0 1 1191 MAX RANDOLPH M 29.0 WASHINGTON DC 16:48 5:25 1 of 78 M 21-39 1 of 33 0:08 16:56
1 2 1080 NEED NAME KAISER RUNNER M 25.0 PORTLAND OR 17:31 5:39 2 of 78 M 21-39 2 of 33 0:09 17:40
2 3 1275 DAN FRANEK M 52.0 PORTLAND OR 18:15 5:53 3 of 78 M 40-54 1 of 27 0:07 18:22
3 4 1223 PAUL TAYLOR M 54.0 PORTLAND OR 18:31 5:58 4 of 78 M 40-54 2 of 27 0:07 18:38
4 5 1245 THEO KINMAN M 22.0 NaN NaN 19:31 6:17 5 of 78 M 21-39 3 of 33 0:09 19:40
# output the dataframe as an array, and see the values in the last two lists have no escape codes
data = df.to_numpy()
print(data[-2:])
[out]:
array([[190, 2087, 'LEESHA POSEY', 'F', 43.0, 'PORTLAND', 'OR',
'1:33:53', '30:17', '112 of 113', 'F 40-54', '36 of 37', '0:00',
'1:33:53'],
[191, 1216, 'ZULMA OCHOA', 'F', 40.0, 'GRESHAM', 'OR', '1:43:27',
'33:22', '113 of 113', 'F 40-54', '37 of 37', '0:00', '1:43:27']],
dtype=object)
Ответ №4:
text = [['190', '2087', 'rnrn LEESHA POSEYrnrn ', 'F', '43', 'PORTLAND', 'OR', '1:33:53', '30:17', 'rnrn 112 of 113rnrn ', 'F 40-54', 'rnrn 36 of 37rnrn ', '0:00', '1:33:53'], ['191', '1216', 'rnrn ZULMA OCHOArnrn ', 'F', '40', 'GRESHAM', 'OR', '1:43:27', '33:22', 'rnrn 113 of 113rnrn ', 'F 40-54', 'rnrn 37 of 37rnrn ', '0:00', '1:43:27']]
print(text)
for i in range(len(text)):
for j in range(len(text[i])):
text[i][j] = text[i][j].replace('rn', '')
print(text)
Выход:
[['190', '2087', 'rnrn LEESHA POSEYrnrn ', 'F', '43', 'PORTLAND', 'OR', '1:33:53', '30:17', 'rnrn 112 of 113rnrn ', 'F 40-54', 'rnrn 36 of 37rnrn ', '0:00', '1:33:53'], ['191', '1216', 'rnrn ZULMA OCHOArnrn ', 'F', '40', 'GRESHAM', 'OR', '1:43:27', '33:22', 'rnrn 113 of 113rnrn ', 'F 40-54', 'rnrn 37 of 37rnrn ', '0:00', '1:43:27']]
[['190', '2087', ' LEESHA POSEY ', 'F', '43', 'PORTLAND', 'OR', '1:33:53', '30:17', ' 112 of 113 ', 'F 40-54', ' 36 of 37 ', '0:00', '1:33:53'], ['191', '1216', ' ZULMA OCHOA ', 'F', '40', 'GRESHAM', 'OR', '1:43:27', '33:22', ' 113 of 113 ', 'F 40-54', ' 37 of 37 ', '0:00', '1:43:27']]