读取txt文件语句回顾
1.read() / read([size]): 按照输入的size值,从文件当前位置起读取size个字节,若未预置size,则一次性读取整个文件内容。读取后在python内以字符串格式存储。如果需要对文件按行进行处理,则不可用该方法。
2.readline() :每次读取一行内容,返回的是一个字符串对象。以行扫描的形式读取速度慢,在行扫描读取时,类似于堆栈指针,读完一行之后指针向下,读取下一行(理解这点对后面解决问题很重要)。
3.readlines() :一次性读取整个文件内容,并按行返回到list,每一行作为list的一个元素存储,方便对list操作。
问题介绍
部分爬取评论展示:
1.拍照效果:不错,很清楚,很清楚,清楚
2.性价比很高的一款机型,拍摄清晰,运行流畅。
3.外形外观:非常漂亮
待机时间:长
屏幕音效:很好
拍照效果:不错
4.不错
5.外形外观:与图片无差异
屏幕音效:挺好的
拍照效果:跟介绍的功能一样
运行速度:不玩游戏挺快的 在疫情期间,能够如此快速度收到请回复不愧是京东!
6.很喜欢,手感也很好。
在对txt读取时,期望达到的效果是一个用户发表的评论作为一个list元素存储,如上显示了6条评论,其中由于评论本身的格式问题,第3条和第5条,本身为一个用户发表的1条评论,但在txt中保存时占了多行,所以利用readlines( )语句读取此种格式的评论时,会将一条完整的评论按行数划分成多个list元素,这显然不是我们想要的。
初步想法是为每一个用户的评论结束后加入特定的结束标志。利用判断语句,如果能在此行读到结束标志,则说明此用户发表的只占一行,可以直接按行读取后,利用append( )语句不断添加到list。
而如果在此行读不到结束标志,说明此用户发表的为占多行的评论,则需要对每一行进行保存:
在此行读不到结束标志,保存此行,在下一行任然读不到结束标志,保存之前的行与此行,直到读到结束标志,把保存的所有行作为一个元素存入list。
如何在readlines( )基础上用代码解决此种问题,我的解决方法要结合txt存和txt读。
存入txt时在一个用户的评论句尾添加“***”作为完结标志
import requests
import re
import json
import time
headers={
'Accept': '*/*',
'User_Agent':'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36',
'Referer':'https://item.jd.com/100003884761.html'
}
url='https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98&productId=100003884761&score=0&sortType=6&page=0&pageSize=10&isShadowSku=0&fold=1'
urls=['https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98&productId=100003884761&score=0&sortType=6&page={}&pageSize=10&isShadowSku=0&fold=1'.format(str(i)) for i in range(0,100,1)]
def get_reviews(url,data=None):
time.sleep(2)
response=requests.get(url,headers=headers)
cont=response.text
rex=re.compile(r'\w+[(]{1}(.*)[)]{1}')
conten=rex.findall(cont)[0]
con=json.loads(conten)
news=con['comments']
#以上为我构造的动态爬虫
with open('content.txt','a',encoding='utf-8') as f:
for n in news:
info=n['content']+'***'+'\n'
#在将评论存入txt时,每一个用户评论后加入'***'作为结束标识,同时要加上换行符'\n',方便readline()语句的按行读取评论
f.write(info)
for single_url in urls:
get_reviews(single_url)读取txt时识别“***”完结标志,利用判断语句判断某用户评论是否在此行完结
a=[]
b=str()
#首先创建一个空列表和空字符串
with open('micc9econtent2.txt','r',encoding='utf-8') as f:
lines=f.readlines()
for line in lines:
#构建循环一行一行读取txt内容
if '***' not in line:
b=b+line.split('\n')[0]
#如果此行读不到结束标志,把此行保存在字符串中(记得要去掉之前添加的分行符),读下一行如果仍读不到结束标志,将下一行与之前的行一起存入字符串
else:
c=b+line
c=c.split('***')[0]
a.append(c)
b=''
#如果终于读到了结束标志,将带有结束标志的本行和之前保存的多行作为一个元素存入列表(记得要去掉之前添加的分行符和结束标志)
#还有一点要记得在读到结束标志后清除用来存储行而建立的字符串,以便下次存储
f.close()
print(len(a))以上就是全部内容,希望有帮助。