Попытка записать результаты набора в CSV-файл в Python, но получить только одну строку для печати - PullRequest
0 голосов
/ 18 марта 2019

Застрял на чем-то и надеюсь получить некоторые идеи о том, что я делаю здесь неправильно.Я написал программу очистки веб-страниц, которая удаляет все веб-ссылки с веб-сайта census.gov, но когда я пытаюсь записать свои результаты в файл CSV, я получаю только одну из ссылок для записи вместо полного списка.Смотрите код ниже.Чтобы убедиться, что мой набор работает правильно, я добавил строку кода, которая сначала печатает результаты моего набора, а затем переписывает результаты в csv.Первоначальные результаты выглядят правильно, так как я вижу полный список ссылок.Тем не менее, я не уверен, почему я могу записать только одну строку данных для Excel CSV:

import requests
from bs4 import BeautifulSoup, SoupStrainer
import bs4, csv
search_link = "https://www.census.gov/programs-surveys/popest.html"
search = requests.get(search_link).text
raw_html = search
soup = BeautifulSoup(raw_html, 'html.parser')
import re
links = soup.find_all('a', {'class': re.compile('uscb*')})
urls_set = set()
for link in links:
    my_links = link.get("href")
    if my_links not in urls_set:
        urls_set.add(my_links)
        print(my_links)
with open("Current Estimate Result.csv",'wb') as f:
         cw = csv.writer(f)
         cw.writerows(my_links)
         print(my_links)        
         f.close()

1 Ответ

1 голос
/ 18 марта 2019

Проблема в том, что переменная my_links содержит последний прочитанный URL. Поэтому cw.writerows(my_links) записывает только этот URL, а не все URL-адреса, которые на самом деле хранятся в urls_set.

Однако я не уверен, что вы используете метод writerows() полностью правильно. Этот метод ожидает итератор объектов строки (обычно список списков). Каждый вложенный список представляет строку в файле CSV.

Так что может быть лучше сохранить URL-адреса в списке, а не в наборе, а затем обернуть каждый URL-адрес в свой собственный список (строку) перед добавлением. Например:

urls_list = []
for link in links:
    my_link = [link.get("href")]  # A row in the csv
    if my_link not in urls_list:
        urls_list.append(my_link)

    ...
    cw.writerows(urls_list)  # Pass the overall list

Примечание. В приведенном выше примере я переименовал my_links в my_link. Использование списка также обеспечит сохранение порядка.

...