Как удалить escape-коды из строк после очистки веб-сайта

#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-список

Что мы используем:
  1. Понимание списка
  2. strip() метод
  3. Вот и все 🙂

Используйте приведенный ниже код:

 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() работать не будет.
  • Поскольку это правильно считывает таблицы, нет дополнительных 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']]