Одно практическое правило, которое я придерживаюсь при парсинге веб-страниц, - это указывать c как можно более без сбора ненужной информации. Так, например, если я хочу выбрать имя пользователя, я проверяю элемент, содержащий нужную мне информацию:
<a class="Username" href="...">Username</a>
Поскольку я пытаюсь собрать имена пользователей, имеет смысл выбирать по классу «Имя пользователя» :
soup.select("a.Username")
Это дает мне список всех имен пользователей, которые можно найти на странице, это замечательно, однако, если мы хотим выбрать данные в «пакетах» (по почте в вашем примере мы нужно собирать каждое сообщение индивидуально.
Для выполнения sh этого вы можете сделать что-то вроде следующего:
comments = soup.select("div.comment")
Это упростит выполнение следующих действий:
with open('file.csv', 'w', newline='') as file:
writer = csv.writer(file)
writer.writerow(['user', 'date', 'text']
for comment in comments:
username = comment.select_one("div.Username")
date = comment.select_one("span.BodyDate")
message = comment.select_one("div.Message")
writer.writerow([username, date, message])
Выполнение этого способа также гарантирует, что ваши данные останутся в порядке, даже если элемент отсутствует.