目标url: https://www.qiushibaike.com/text/ (纯文字)
尝试抓取糗事百科的 作者和段子
源代码:(非常粗糙!!!)
# -*- coding: utf-8 -*-
import requests
import re
url = "http://www.qiushibaike.com/text/"
content = requests.get(url).content
pattern = re.compile('<div class="author clearfix">.*?<h2>(.*?)</h2>.*?<div class="content">.*?<span>(.*?)</span>.*?</div>',re.S)
names = re.findall(pattern,content)
for i in names:
print (i[0])
print (i[1])
详细讲解:
感觉如果 懂得 requests, 最大的难度只会是 正则表达式,
requests很容易看懂, 获得url 的全部 页面源代码
可自行先打开链接 查看页面元素,分析发现, 主要内容代码都是如下格式:
<pre id="line1"><div class="article block untagged mb15 typs_long" id='qiushi_tag_120993041'> <div class="author clearfix"> <a href="/users/28719312/" target="_blank" rel="nofollow" style="height: 35px" onclick="_hmt.push(['_trackEvent','web-list-author-img','chick'])"> <img src="//pic.qiushibaike.com/system/avtnew/2871/28719312/thumb/20180907212738.jpg?imageView2/1/w/90/h/90" alt="阿兰若诗"> </a> <a href="/users/28719312/" target="_blank" onclick="_hmt.push(['_trackEvent','web-list-author-text','chick'])"> <h2> 阿兰若诗 </h2> </a> <div class="articleGender manIcon">39</div> </div> <a href="/article/120993041" target="_blank" class="contentHerf" onclick="_hmt.push(['_trackEvent','web-list-content','chick'])"> <div class="content"> <span> 早上去一家早点店喝豆浆吃油条包子……正吃喝着时,老板娘那约模三岁大的儿子拿着一筒奥利奥夹心饼干走到我桌前,调皮的把一个饼干扔到我的豆浆碗里,我对他笑了笑,捞起饼干吃了……孩子见我对他笑,也“呵呵呵”的笑了起来,可能他觉得好玩,接着又把一个饼干扔到我的豆浆碗里,我又吃了……他接着又扔,我又吃……不一会,一筒饼干扔完了,这孩子哭了……我一看情况可能不妙,赶紧起身走人…… </span> </div></pre>
我们主要需要的内容就是 汉字最多的内容,为了对作者表示尊重,把 作者名字也展示出来比较好
re匹配如下:
pattern = re.compile('<div class="author clearfix">.?<h2>(.?)</h2>.?<div class="content">.?<span>(.?)</span>.?</div>',re.S)
- . * ?
这里每一块的中间部分是必须用 . * ? 的 (. 代表所有,但是默认是 截取全文两端之前 最长的字符 ; . * ?是 截取全文两端之前 最d短的字符 ), shell里也有类似的规则,举个简单例子:
有段文字: aLOLaHEROa 如果是a.a 得到的是aLOLaHEROa ;
如果是a.*?a ,得到的将是aLOLa - (. * ?)
给内容打上(), 之后是直接可以输出 . * ? 所对应的内容,和 nginx配置经常用到的位置符感觉是一个意思
可以看到脚本 最后的
print (i[0]) 和 print (i[1]) 就是分别输出两个带夸号 里的内容
()里的内容也已经分别成为一个数组了 - re.S
re.S 标志代表在匹配时为点任意匹配模式,点 . 也可以代表换行符
附运行结果:
图片.png












网友评论