with open()语句
结构
with open(name,mode,encoding) as file:
file.writen()
name
:包含文件名称的字符串,可指定路径,如'C:\Users\38153\Desktop\文件名.文件格式'
,如果不加路径,它将会保存在你当前工作目录中。
mode
:决定了打开文件的模式,只读/写入/追加等,
r
------------------------只读。若不存在文件会报错
w
-----------------------只写。若不存在文件会自动新建
a
-----------------------附加到文件尾
encoding
:表示要写入的编码方式,一般为utf-8或gbk
file
:表示我在代码中对文件的命名。
以爬取豆瓣图书top250为例
# -*-coding:utf-8-*-
import requests
from lxml import etree
import time
count = 1 #计数器
with open('test.txt','w',encoding = 'utf-8') as f:
#一页25本书,一共10页,循环十次。
for i in range(10):
#第一页:https://book.douban.com/top250?start=0
#第二页:https://book.douban.com/top250?start=25
#第三页:https://book.douban.com/top250?start=50
#。。。以此类推得:
url = 'https://book.douban.com/top250?start={}'.format(i*25)
data = requests.get(url).text #获取页面的text
s = etree.HTML(data) #解析data
books = s.xpath('/html/body/div[3]/div[1]/div/div[1]/div/table')
#print(scores)
for div in books:
name = div.xpath('./tr/td[2]/div[1]/a/@title')[0]
athor= div.xpath('./tr/td[2]/p[1]/text()')[0]
score = div.xpath('./tr/td[2]/div[2]/span[2]/text()')[0]
quote = div.xpath('./tr/td[2]/p[2]/span/text()')
print(count)
#有的文章没有qoute部分
if len(quote)>0:
#print("title:{}\tathor:{}\nscore:{}\tquote:{}\n\n".format(name,athor,score,quote)
#直接输入上文会产生问题,加上 .encode('GBK','ignore').decode('GBk') 也就是先用gbk编码,
#忽略掉非法字符,然后再译码
f.write("title:{}\tathor:{}\nscore:{}\tquote:{}\n\n".format(name,athor,score,quote).encode('GBK','ignore').decode('GBk'))
else:
f.write("title:{}\tathor:{}\nscore:{}\n\n".format(name,athor,score))
count += 1 #计数器加一
网友评论