坚持做一些事情,希望对我在这里做错的事情有所了解。我已经编写了一个Web抓取程序,该程序从census.gov网站上抓取了所有Web链接,但是当我尝试将结果写到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()
答案 0 :(得分:1)
问题是my_links
变量保存了最近读取的URL。因此,cw.writerows(my_links)
仅写出该URL,而不是全部写在urls_set
中的URL。
但是,我不确定您对writerows()
方法的使用是否完全正确。 This method expects an iterator of row objects(通常是列表列表)。每个嵌套列表代表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
。使用列表还可以确保保留订单。