一、环境配置
需要requests、lxml第三方库
二、代码
import requests
from lxml import etree
url ='https://so.gushiwen.org/shiwen/'
r = requests.get(url)
selector = etree.HTML(r.text)
for eacharticle in selector.xpath('//div[@class="left"]/div[@class="sons"]'):
work = eacharticle.xpath('div[@class="cont"]/p/a/b/text()')
age = eacharticle.xpath('div[@class="cont"]/p[@class="source"]/a/text()')[0]
author = eacharticle.xpath('div[@class="cont"]/p[@class="source"]/a/text()')[1]
content = eacharticle.xpath('string(div[@class="cont"]/div[@class="contson"])')
tag = eacharticle.xpath('div[@class="tag"]/a/text()')
print(work,age,author,content,tag)
我们在pycharm里运行这段代码,输出结果截取片段如下:
这里的work,tag为列表,age,author,content为字符串形式
注意到在爬取正文content的时候,我们并没有直接用/text(),而是用了string()函数,改用下面这行代码看看输出会怎么样
content = eacharticle.xpath('div[@class="cont"]/div[@class="contson"]/text()')
输出结果:
这时,爬虫爬取的结果不尽人意,让我们回到网页上一探究竟:
可以看出,在未能爬到的水调歌头div class="contson"标签下,正文被<p>标签分割成了几部分,/text()是无法获取到子标签下的内容的。故在这一部分改用了string()函数,可以获取该节点下所有子节点的内容,并以字符串的形式输出。