Запись в CSV-файл выводит каждое письмо в отдельной ячейке - PullRequest
0 голосов
/ 22 февраля 2019
import bs4 as bs
import urllib.request
import csv

source = 
   urllib.request.urlopen('http://www.thebest100lists.com/best100actors/').read()

soup = bs.BeautifulSoup(source, 'lxml')

for paragraph in soup.find_all('ol'):
    celebList = paragraph.text
    print(celebList)

with open('celebList.csv', 'w', newline='') as f:
    writer = csv.writer(f)

writer.writerow[soup.title.string]
for i in celebList:
    writer.writerow([i])

Я играю с красивым супом 4, чтобы вычистить данные из списка на веб-сайте и вывести их в файл .csv.Я правильно очистил данные, которые ищу, но при сохранении запуска программы файл csv имеет каждую букву в отдельной ячейке в одной строке.Я попытался преобразовать данные в строку, и я также попытался поместить (i) в квадратные скобки, но это не помогло мне.

Ответы [ 4 ]

0 голосов
/ 22 февраля 2019

Я думаю, что было бы более эффективно использовать селектор класса для тега, чтобы получить список без пробелов, а затем выгрузить его в csv с пандами

from bs4 import BeautifulSoup
import requests
import pandas as pd

url = 'http://www.thebest100lists.com/best100actors/'
res = requests.get(url)
soup = BeautifulSoup(res.content, "lxml")
names = [name.text for name in soup.select('a.class1')]
df = pd.DataFrame(names,columns=['Names'])
df.to_csv(r'C:\Users\User\Desktop\Celebs.csv', sep=',', encoding='utf-8',index = False )
0 голосов
/ 22 февраля 2019

Вы можете сделать:

celeblistsplit=celebList.split('\n')
celeblistsplit

А затем:

f=open('output.csv','w')
for each in celeblistsplit:
    if len(each)>0:
        f.write(each)
        f.write(',')
        f.write('\n')
f.close()

Полученный файл:

Robert De Niro,
Al Pacino,
Tom Hanks,
Johnny Depp,
Jack Nicholson,
Marlon Brando,
Meryl Streep,
Leonardo DiCaprio,
...
0 голосов
/ 22 февраля 2019
import bs4 as bs
import urllib.request
import csv

source = urllib.request.urlopen('http://www.thebest100lists.com/best100actors/').read()

soup = bs.BeautifulSoup(source, 'lxml')

celebList = []     # an empty list to store the text
for paragraph in soup.find_all('ol'):
    celebList.append(paragraph.text)
    # print(celebList)

# file writing
# print(celebList) # ["\nRobert De Niro\n\nAl Pacino\n\nTom Hanks\n\nJohnny .. ] 
celebList = map(lambda s: s.strip(), celebList)   # removing the leading spaces in the list
celebList = list(celebList)


with open('celebList.csv', 'w') as file:
    for text in celebList:
        file.write(text)

ВЫХОД:

Robert De Niro

Al Pacino

Tom Hanks

Johnny Depp

Jack Nicholson

Marlon Brando

.
.
.
0 голосов
/ 22 февраля 2019

вы перебираете текст в celebList, а не в списке.

вы, вероятно, хотите сделать что-то вроде

celebList = []
for paragraph in soup.find_all('ol'):
    celebList.append(paragraph.text)
...