我目前正在浏览网页,并从每个<td>
元素中提取值,并将它们作为文本追加到列表中,我想将其导出到Excel电子表格中。
问题是我想将所有不同网页中的值复制到电子表格上各自的行中,但是我只能在发送到excel之前弄清楚如何将所有数据附加到列表中,因此这是打印所有数据到1行。
我真的需要在excel中将每个网页放在单独的一行上,但无法弄清楚如何编写。
这就是我所拥有的-
import requests, bs4, xlsxwriter
td_text = []
row = 0
col = 0
def print_table():
for i in range(1, 10):
base_link = 'http://some/website/%d' % (i)
try:
res = requests.get(base_link)
res.raise_for_status()
techSoup = bs4.BeautifulSoup(res.text, 'html.parser')
table = techSoup.find('table', attrs={'class':'table borderless'})
for div in table:
rows = div.findAll('td')
for string in rows:
td_text.append(string.text)
print(string.text)
send_excel(row, col)
except requests.exceptions.HTTPError:
print('Error: Invalid Website \n\n.')
def send_excel(row, col):
workbook = xlsxwriter.Workbook('list.xlsx')
worksheet = workbook.add_worksheet()
row += 1
worksheet.write_row(row, col, td_text)
workbook.close()
print_table()
所有数据均正确地从网站中提取。
我可以看到我的问题是,在调用write_row()
之前,所有数据都会追加到列表中,但是我不确定如何编写它,因此每个网站在遍历循环时都会写入电子表格。
答案 0 :(得分:0)
如果考虑代码的执行位置(就局部作用域和循环而言),您将意识到您要打开和关闭该文件数十次(效率非常低下),永远不要增加行计数器,并且切勿在两次请求之间清除文本数据。您只需要打开和关闭文件一次,就可以为每组数据只写一次该行。尝试这样的事情:
import requests, bs4, xlsxwriter
workbook = xlsxwriter.Workbook('list.xlsx')
worksheet = workbook.add_worksheet()
for i in range(1, 10):
td_text = []
base_link = 'http://some/website/%d' % (i)
try:
res = requests.get(base_link)
res.raise_for_status()
techSoup = bs4.BeautifulSoup(res.text, 'html.parser')
table = techSoup.find('table', attrs={'class':'table borderless'})
for div in table:
rows = div.findAll('td')
for string in rows:
td_text.append(string.text)
worksheet.write_row(i, 0, td_text)
except requests.exceptions.HTTPError:
print('Error: Invalid Website \n\n.')
workbook.close()