TypeError: a bytes-like object is required, not 'str' in python and CSV
TypeError: a bytes-like object is required, not 'str'
在执行下面的python代码时将错误的表格数据保存在Csv文件中。 不知道如何获得rideup.pls帮助我。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | import csv import requests from bs4 import BeautifulSoup url='http://www.mapsofindia.com/districts-india/' response=requests.get(url) html=response.content soup=BeautifulSoup(html,'html.parser') table=soup.find('table', attrs={'class':'tableizer-table'}) list_of_rows=[] for row in table.findAll('tr')[1:]: list_of_cells=[] for cell in row.findAll('td'): list_of_cells.append(cell.text) list_of_rows.append(list_of_cells) outfile=open('./immates.csv','wb') writer=csv.writer(outfile) writer.writerow(["SNo","States","Dist","Population"]) writer.writerows(list_of_rows) |
在最后一行上方。
您使用的是Python 2方法而不是Python 3。
更改:
1 | outfile=open('./immates.csv','wb') |
至:
1 | outfile=open('./immates.csv','w') |
并且您将获得具有以下输出的文件:
1 2 3 4 5 6 7 8 9 | SNo,States,Dist,Population 1,Andhra Pradesh,13,49378776 2,Arunachal Pradesh,16,1382611 3,Assam,27,31169272 4,Bihar,38,103804637 5,Chhattisgarh,19,25540196 6,Goa,2,1457723 7,Gujarat,26,60383628 ..... |
在Python 3中,csv以文本模式获取输入,而在Python 2中,它以二进制模式获取。
编辑添加
这是我运行的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | url='http://www.mapsofindia.com/districts-india/' html = urllib.request.urlopen(url).read() soup = BeautifulSoup(html) table=soup.find('table', attrs={'class':'tableizer-table'}) list_of_rows=[] for row in table.findAll('tr')[1:]: list_of_cells=[] for cell in row.findAll('td'): list_of_cells.append(cell.text) list_of_rows.append(list_of_cells) outfile = open('./immates.csv','w') writer=csv.writer(outfile) writer.writerow(['SNo', 'States', 'Dist', 'Population']) writer.writerows(list_of_rows) |
我对Python3也有同样的问题。
我的代码写入了
替换为
1 2 3 4 5 6 7 | file = open('parsed_data.txt', 'w') for link in soup.findAll('a', attrs={'href': re.compile("^http")}): print (link) soup_link = str(link) print (soup_link) file.write(soup_link) file.flush() file.close() |
在我的例子中,我使用BeautifulSoup用Python 3.x编写.txt。 它有同样的问题。 正如@tsduteba所说,将第一行的'wb'改为'w'。