代码如下:
# -*- coding: utf-8 -*
import urllib.request,socket,re,sys,os,time,requests
from lxml import etree
with open(r'C:\Users\admin\Desktop\practice_csdn.txt','w') as f:
for p in range(1,3): #range(1,3),代表第一页,第二页
url='https://bbs.csdn.net/forums/Oracle?page={}'.format(p)
headers={'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',
'Referer': 'https://bbs.csdn.net/forums/Oracle'}
response=requests.get(url=url,headers=headers)
response.encoding='utf-8'
html=response.text
s=etree.HTML(html)
time.sleep(2)
block=s.xpath('//*[@id="forums-show"]/div[3]/div[1]/div/dl/dt/h1/text()')[0]
f.write('论坛名称:{}'.format(block)),f.write('\n')
f.write('第{}页:\n'.format(p)),f.write('*'*120),f.write('\n')
cmax=0
pimax=s.xpath('//*[@id="forums-show"]/div[3]/div[4]/table/tr') #结构是一个table下面多个tr,每条信息在tr里面,所以用tr
for pimaxx in pimax:
cmax=cmax+1
print (cmax) #获取总条目,结果是53,比最后一条xpath[]52大1,所以接下来用‘<’
count=2 #第一个标题的xpath是2,用while循环加format()方法更方便
while count<cmax :
title= s.xpath('//*[@id="forums-show"]/div[3]/div[4]/table/tr[{}]/td[1]/a/text()'.format(count))[0]
sort= s.xpath('//*[@id="forums-show"]/div[3]/div[4]/table/tr[{}]/td[1]/span/a/text()'.format(count))[0]
score= s.xpath('//*[@id="forums-show"]/div[3]/div[4]/table/tr[{}]/td[2]/text()'.format(count))[0]
writer=s.xpath('//*[@id="forums-show"]/div[3]/div[4]/table/tr[{}]/td[3]/a/@title'.format(count))[0]
wtime= s.xpath('//*[@id="forums-show"]/div[3]/div[4]/table/tr[{}]/td[3]/span/text()'.format(count))[0]
count=count+1
time.sleep(1)
print ('标题:{}[{}]\n分数:{} 提问人:{} 提问时间:{}\n'.format(title,sort,score,writer,wtime),'*'*50)
f.write('标题:{}[{}]\n分数:{} 提问人:{} 提问时间:{}\n'.format(title,sort,score,writer,wtime)),f.write('*'*50),f.write('\n')
f.flush()
结果如下:
分析:
1、这里的关键点就在于灵活地处理xpath,灵活地运用;
2、浏览器复制的xpath并不一定是对的,需要自己去页面代码查看!
3、注意查看网页的编码,是否需要转码,最好习惯性用转码:str转成bytes用encode,bytes转成str用decode。这里因为是get()方法,数据只包含str格式,所以只能用encode()方法。简记:gse,ubd!