Проблема и вопрос в следующем: почему csv.writerows()
выводит множество столбцов в одной строке только вместо нескольких строк и одного столбца, как требуется и ожидается?
Вот подробности:
Мне нужно собрать много электронных писем с разных страниц веб-сайта, и у меня нет времени копировать / вставлять каждое электронное письмо.
Итак, я разработал скребок для электронной почты веб-страницы HTML, используя несколько стандартных библиотек на Python, а также стороннюю библиотеку Beautiful Soup 4.
Сценарии, которые я разработал, подключаются к веб-странице или, в данном случае, к локальному файлу на моем компьютере.
Сценарий прекрасно работает для очистки и сбора всех тегов привязки HTML (<a></a>
) из файла HTML, а затем компилирует их в список тегов привязки.
Затем он извлекает адреса электронной почты с помощью регулярных выражений, а затем делает два экземпляра каждого адреса электронной почты (которые находятся в тегах привязки) строчными, чтобы я мог объединить их в набор уникальных электронных адресов. адреса электронной почты.
Затем я преобразовываю этот набор уникальных адресов электронной почты в список адресов электронной почты, а затем размещаю их в алфавитном порядке с помощью метода sort()
объектов списка Python.
Затем я преобразую этот алфавитный список электронных писем в набор букв алфавита.
Затем я добавляю этот набор букв алфавита в список, содержащий ровно один элемент (т. Е. Запись в файл CSV не разделяет каждую строку электронной почты на несколько столбцов, обнаруженных при тестировании).
Затем я записываю этот список, содержащий кортеж, в файл CSV, но метод writerows()
записывает их в одну строку только с несколькими столбцами.
Я хочу записать каждую строку адреса электронной почты в несколько строк только в одном столбце.
Спасибо за помощь.
## IMPORT MODULES
## IMPORT MODULES
## IMPORT MODULES
import urllib
import bs4
import re
import pprint
import csv
## DECLARE VARIABLES
## DECLARE VARIABLES
## DECLARE VARIABLES
## EMPTY LIST FOR SCRAPED E-MAILS
ListOfEmails = []
# EMPTY SET FOR SCRAPED E-MAILS
SetOfEmails = set()
## HEADERS FOR OUTPUT TO CSV FILE
##headers = ['emails']
## ROWS FOR E-MAILS FOR OUTPUT TO CSV FILE
ListWithOneTuple = []
## BEGIN MAIN PROGRAM
## BEGIN MAIN PROGRAM
## BEGIN MAIN PROGRAM
## OPEN LOCAL HTML FILE; READ THE HTML DOCUMENT
file = urllib.request.urlopen("file:///c://Python372/local_venv/index.html")
##print(file)
##print(type(file))
##print("\n")
## PARSE THE HTML; MAKE BEAUTIFUL SOUP
soup = bs4.BeautifulSoup(file, features="html.parser")
##print(soup)
##print(type(soup))
##print("\n")
## FIND ALL <a> ANCHOR TAGS; MAKE LIST OF ANCHOR TAGS
ListOfAnchors = soup.find_all("a")
##pprint.pprint(ListOfAnchors)
##print("\n")
##print("Number of Anchor Tags = ", len(ListOfAnchors))
##print("\n")
## FOR EACH ELEMENT IN LIST OF ANCHORS...
for each in ListOfAnchors:
##print(each)
## CONVERT EACH BEAUTIFUL SOUP OBJECT INTO STRING
each = str(each)
##print(type(each))
## REGEX TO EXTRACT E-MAILS TO LIST
ListOfMatches = re.findall("([a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+)", each)
##print("ListOfMatches = ", type(ListOfMatches))
## FOR EACH ELEMENT IN LIST, MAKE E-MAILS LOWERCASE
for email in ListOfMatches:
## CONVERT E-MAILS TO LOWERCASE
EmailLowercase = email.lower()
##print(EmailLowercase, type(EmailLowercase))
##print("\n")
## APPEND E-MAILS TO LIST OF E-MAILS
ListOfEmails.append(EmailLowercase)
## TEST PRINT LIST OF E-MAILS
##print("\n")
##print("ListOfEmails = ", ListOfEmails)
##print(type(ListOfEmails), len(ListOfEmails))
## CONVERT LIST OF E-MAILS TO SET OF E-MAILS
SetOfEmails = set(ListOfEmails)
## TEST PRINT SET OF E-MAILS
##print("\n")
##print("SetOfEmails = ", SetOfEmails)
##print(type(SetOfEmails), len(SetOfEmails))
## CONVERT SET OF E-MAILS BACK TO LIST OF E-MAILS FOR NEXT STEP ALPHABETIC SORTING
ListOfEmailsAlphabetic = list(SetOfEmails)
## ALPHABETIZE LIST OF E-MAILS
ListOfEmailsAlphabetic.sort()
## TEST PRINT ALPHABETIC LIST OF E-MAILS
print("\n")
print(ListOfEmailsAlphabetic, type(ListOfEmailsAlphabetic), len(ListOfEmailsAlphabetic))
## CONVERT ALPHABETIC LIST OF E-MAILS TO TUPLE OF ALPHABETIC E-MAILS
TupleOfEmailsAlphabetic = tuple(ListOfEmailsAlphabetic)
print(TupleOfEmailsAlphabetic, type(TupleOfEmailsAlphabetic), len(TupleOfEmailsAlphabetic))
## APPEND TUPLE OF ALPHABETIC E-MAILS TO LIST TO MAKE LIST OF ONE TUPLE ITEM
ListWithOneTuple.append(TupleOfEmailsAlphabetic)
## TEST PRINT ROWS FOR CSV OUTPUT
print("\n")
print(ListWithOneTuple, type(ListWithOneTuple), len(ListWithOneTuple))
## OPEN CSV FILE TO OUTPUT LIST OF E-MAILS
with open('CSVofEmails.csv','w', newline='') as CSVFile:
FileCSV = csv.writer(CSVFile, delimiter=';')
##FileCSV.writerow(headers)
FileCSV.writerows(ListWithOneTuple)
## END MAIN PROGRAM
## END MAIN PROGRAM
## END MAIN PROGRAM
## GAME OVER
## GAME OVER
## GAME OVER