【发布时间】:2020-09-22 20:32:30
【问题描述】:
我正在尝试从网站上的多个 URL 中抓取非结构化数据。我使用 BeautifulSoup 成功提取了我需要的块。然后,为了帮助构建数据集,我将值添加到列表中,然后再将它们写入 csv 文件。
但是,当尝试传输数据时,只会传输列表中的最后一个值。我认为这是因为每次调用循环时列表都会获取新值。如何不断向文件中添加新值,以便我的 csv 文件具有来自每个循环的值?谢谢。
for i in range(1, 3):
url = "https://website.com/webid={}".format(i)
s = session.get(url, headers=headers, cookies=cookies)
soup = bs(s.text, 'html.parser')
data = soup.find_all('td')
t = soup.find_all('td')
a = t[0]
b = t[1]
c = t[2]
info = [a, b, c]
print(info)
df = pd.DataFrame(info)
df.to_csv('a.csv', index=False, header=False)
针对 cmets 和其他答案:
如果我的原始代码块不清楚,我深表歉意,我试图生成最少的必要代码来解释我的情况。幸运的是,@Matt_F 能够理解并引导我朝着正确的方向前进。对于那些想要更明确地解释我正在运行的代码的人,请参阅下面的完整代码块(不包括导入、cookie、标头和有效负载)。
session = requests.Session()
s = session.post("https://WEBSITE.com/register?view=login&return=aW5kZXgucGhwP0l0ZW1pZD02NjM", data=payload, headers=headers, cookies=cookies)
for i in range(0,9999):
print(i)
# establish connection
url = "https://WEBSITE.com/WEB-SITE/data-list?vw=detail&id={}&return=1".format(i)
s = session.get(url, headers=headers, cookies=cookies)
# set timer for delay
t = time.time()
delay = time.time() - t
time.sleep(10*delay)
# begin to pull data
soup = bs(s.text, 'html.parser')
if "Error: no data found" in s.text:
print('skipped')
else:
soup.prettify()
# print(soup)
d = soup.find_all('td',{"valign": "top"})
d_info = d[0:-1]
print(d_info)
df1 = pd.DataFrame(d_info)
df1t = df1.T
# p = soup.find_all('p')
# p_info = p[0:-1]
# df2 = pd.DataFrame(p_info)
# df2t = df2.T
# result = pd.concat([df1t, df2t], axis=1, sort=False)
df1t.to_csv('file.csv', mode='a', index=False, header=False)
【问题讨论】:
-
你在哪里声明
info? -
你好,亲爱的 Bjørn_Jung - 非常感谢这个很好的例子;我目前正在研究 python、csv 和 pandas 的所有内容。我喜欢你的例子。您能否提供一个 URL,我们可以运行这个出色且清晰的演示代码。那太棒了。期待您的来信。问候;)
标签: python pandas csv web-scraping beautifulsoup