Есть ли другой способ, кроме "strip ()" и "replace ()", чтобы избавиться от лишних пробелов в данных, которые я очистил? - PullRequest
0 голосов
/ 20 апреля 2019

Я довольно новичок в python и пытаюсь настроить веб-браузер, который собирает данные о персонажах, которые погибли в шоу Game of Thrones. Я получил данные, которые хочу, но мне кажется, что я не могу извлечь из этих данных лишний пух.

Я пробовал метод .strip() и .replace(), используя .replace(" ", ""), но каждый раз ничего не меняется. Вот блок моего кода:

url = "http://time.com/3924852/every-game-of-thrones-death/"
r = requests.get(url)
soup = BeautifulSoup(r.content, 'html.parser')

# Find the characters who have died by searching for the text embedded within the <div> tag with class = "headline"
find_deaths = soup.find_all('div', class_="headline")

# Strip out all the extra fluff at the beginning and end of the text and add it to list
for hit in find_deaths:
    deaths.append(hit.contents)

Этот код возвращает элементы в списке, которые выглядят следующим образом:

    deaths = [['\n                            Will\n                          '], ['\n                            Jon Arryn\n                          '], ['\n                            Jory Cassel\n                          ']

Я попробовал следующие методы, чтобы попытаться выделить дополнительный пух, окружающий данные, но он ничего не меняет в списке.

for item in deaths:
       str(item).strip()


for item in deaths:
    str(item).replace("\n ", "")

Используя один из двух методов, описанных выше, я подумал, что это уберет весь лишний пух из элементов в списке, но, похоже, ничего не изменится.

Есть ли другой метод, который я мог бы использовать, кроме полосы и замены, который избавит от лишнего пуха в этих данных.

Ответы [ 3 ]

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

Строки неизменны. strip() и replace() возвращают новые строки, они не меняют оригинал.

Используйте понимание списка, подобное тому, которое предложил @ Tomothy32:

deaths = [hit.contents.strip() for hit in soup.find_all('div', class_="headline")]
0 голосов
/ 20 апреля 2019

Я не могу проверить из-за моего местоположения, но вы должны быть в состоянии избежать этого, но используя уже чистую строку в атрибуте name элементов с классом anchor-only

deaths = [item['name'] for item in soup.select('.anchor-only')]
0 голосов
/ 20 апреля 2019

Вы должны использовать понимание списка:

deaths = [s.strip() for s in deaths]

Однако у вас есть много ненужных промежуточных шагов здесь - вы можете просто использовать понимание списка прямо из find_all:

deaths = [hit.contents[0].strip() for hit in soup.find_all('div', class_="headline")]

С данным сайтом и запросом, deaths будет

['Will', 'Jon Arryn', 'Jory Cassel', 'Benjen Stark', 'Robert Baratheon', 'Syrio Forel', 'Eddard Stark', 'Viserys Targaryen', 'Drogo', 'Rhaego', 'Mirri Maz Duur', 'Rakharo', 'Yoren', 'Renly Baratheon', 'Rodrik Cassel', 'Irri', 'Maester Luwin', 'Qhorin', 'Pyat Pree', 'Doreah', 'Xaro Xhoan Daxos', 'Hoster Tully', 'Jeor Mormont', 'Craster', 'Kraznys', 'Beric Dondarrion', 'Ros', 'Talisa Stark', 'Robb Stark', 'Catelyn Stark', 'Polliver', 'Tansy', 'Joffrey Baratheon', 'Karl Tanner', 'Locke', 'Rast', 'Lysa Arryn', 'Oberyn Martell', 'The Mountain', 'Grenn', 'Mag the Mighty', 'Pyp', 'Styr', 'Ygritte', 'Jojen Reed', 'Shae', 'Tywin Lannister', 'Mance Rayder', 'Janos Slynt', 'Barristan Selmy', 'Maester Aemon', 'Karsi', 'Shireen Baratheon', 'Hizdahr zo Loraq', 'Selyse Baratheon', 'Stannis Baratheon', 'Myranda', 'Meryn Trant', 'Myrcella Baratheon', 'Jon Snow', 'Areo Hotah', 'Doran Martell', 'Trystane Martell', 'The Flasher', 'Roose Bolton', 'Walda Bolton', 'Unnamed Bolton Child', 'Balon Greyjoy', 'Alliser Thorne', 'Olly', 'Ser Arthur Dayne', 'Osha', 'Khal Moro', 'Three-Eyed Raven', 'Leaf', 'Hodor', 'Aerys II Targaryen, "The Mad King"', 'Brother Ray', 'Lem', 'Brynden Tully (The Blackfish)', 'Lady Crane', 'The Waif', 'Razdal mo Eraz', 'Belicho Paenymion', 'Rickon Stark', 'Jon Umber', 'Wun Weg Wun Dar Wun', 'Ramsay Bolton', 'Grand Maester Pycelle', 'Lancel', 'The High Sparrow', 'Loras Tyrell', 'Mace Tyrell', 'Kevan Lannister', 'Margaery Tyrell', 'Tommen Baratheon', 'Walder Rivers', 'Lothar Frey', 'Walder Frey', 'Lyanna Stark', 'Nymeria Sand', 'Obara Sand', 'Tyene Sand', 'Olenna Tyrell', 'Randyll Tarly', 'Dickon Tarly', 'Thoros of Myr', 'Petyr "Littlefinger" Baelish', 'Ned Umber']
...