Записать файл CSV из очищенных данных с помощью Beautiful Soup - PullRequest
0 голосов
/ 16 февраля 2020

Вот как я очистил данные с помощью Beautifulsoup.

comments =[]
users_list = []
users = driver.find_elements_by_class_name('_6lAjh')

for user in users:
    users_list.append(user.text)

i = 0
texts_list = []
texts = driver.find_elements_by_class_name('C4VMK')

for txt in texts:
    texts_list.append(txt.text.split(users_list[i])[1].replace("\r"," ").replace("\n"," "))
    i += 1
    comments_count = len(users_list)

for i in range(1, comments_count):
    user = users_list[i]
    text = texts_list[i]
    print("User ",user)
    print("Text ",text)
    print()
    comments.append(users_list[i])
    comments.append(texts_list[i])
    idxs = [m.start() for m in re.finditer('@', text)]
    for idx in idxs:
        handle = text[idx:].split(" ")[0]

print(handle)

Это текстовые данные, которые у меня есть, это имя пользователя, комментарии и количество лайков из Instagram. «heyyy 3w1 likeReply» -> «heyyy» - это комментарий здесь, 3w означает, что комментарий был написан 3 недели a go, 1 like - это количество лайков

print(comments)
['User1',
 ' ? 3w1 likeReply',
 'User2',
 ' ? 3w1 likeReply',
 'User3',
 ' Looking good! Collab, DM "bruteimpact.fashion 3wReply',
 'User4',
 ' heyyy 3w5 likeReply']

Я хочу сохранить это в CSV-файл, который выглядит следующим образом (три столбца - ID, Comments, likes_count):

ID  Comments  likes_count
User1 ?       0
User2 ?       1
User3 Looking good! Collab, DM "bruteimpact.fashion  0
User4 heyyy    5

Пока это код, который я написал, но он далек от результата, который я хочу получить, и я не знаю как добраться до конечного пункта вообще. Кроме того, я понятия не имею, как создать отдельный «likes_count», отделив количество лайков от данных комментариев, которые у меня есть. Тем не менее, я был бы удовлетворен CSV-файлом только с «ID» и «Текст» столбца без «likes_count». Пожалуйста, помогите мне!

fields = ["User", "Text"]
rows = [comments]
filename = "insta_records.csv"
with open(filename, 'w', encoding='utf-8') as csvfile: 
    csvwriter = csv.writer(csvfile) 
    csvwriter.writerow(fields) 
    csvwriter.writerows(rows) 

1 Ответ

1 голос
/ 16 февраля 2020

У вас есть плоский список, чтобы вы могли использовать zip для группировки пользователей и их комментариев

comments = ['User1',
 ' ? 3w1 likeReply',
 'User2',
 ' ? 3w1 likeReply',
 'User3',
 ' Looking good! Collab, DM "bruteimpact.fashion 3wReply',
 'User4',
 ' heyyy 3w5 likeReply']

rows = []
for user, text in zip(comments[::2], comments[1::2]):
    print(user, text)
    #rows.append([user, text])


fields = ["User", "Text"]
filename = "insta_records.csv"
with open(filename, 'w', encoding='utf-8') as csvfile: 
    csvwriter = csv.writer(csvfile) 
    csvwriter.writerow(fields) 
    csvwriter.writerows(rows) 

Результат на экране

User1  ? 3w1 likeReply
User2  ? 3w1 likeReply
User3  Looking good! Collab, DM "bruteimpact.fashion 3wReply
User4  heyyy 3w5 likeReply

И в файле

User,Text
User1, ? 3w1 likeReply
User2, ? 3w1 likeReply
User3," Looking good! Collab, DM ""bruteimpact.fashion 3wReply"
User4, heyyy 3w5 likeReply

Чтобы создать другие столбцы, вам необходимо сначала отредактировать комментарии - split(), replace(), срез [start:end], et c.

rows = []
for user, text in zip(comments[::2], comments[1::2]):
    parts = text.rsplit(' ', 2)#[:-1]
    parts.insert(0, user)
    print(parts)
    rows.append(parts)

Результат на экране

['User1', ' ?', '3w1', 'likeReply']
['User2', ' ?', '3w1', 'likeReply']
['User3', ' Looking good! Collab, DM', '"bruteimpact.fashion', '3wReply']
['User4', ' heyyy', '3w5', 'likeReply']

, но в '3wReply' отсутствует пробел, поэтому он не разделяется правильно, и для правильного разбиения потребуется больше работы.

Кстати: когда у вас есть 3w5, тогда Вы можете split('w') получить ['3', '5'], но в HTML может быть другой текст вместо w, так что это потребует дополнительной работы. Возможно, используя более сложные правила в BeautifulSoup, вы могли бы лучше разделить его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...