一、BeautifulSoap
1.首先必须要导入bs4库,创建BeautifulSoap对象
#coding=utf-8
from bs4 import BeautifulSoup
soup = BeautifulSoup(html,'lxml') #html 为下载的网页,lxml为解析器
2.BeautifulSoap主要掌握三种方法
find_all('tag') 搜索当前所有的tag标签的集合
find("tag") 返回一个标签(这个方法用的少)
select("") 可以按标签查找,用的多是按标签逐层查找筛选元素
二、使用BeautifulSoup提取网页内容的一些技巧
1.find_all() 方法中单独的标签名,如a ,会提取网页中所有的 a 标签,这里要确保是我们所需要的链接a , 一般都不是,需要加上条件(就是标签的属性,加上限制筛选),如果这一及标签没有属性,最好往上一级找。
https://www.qiushibaike.com/text/,链接:段子戳我,抓取原创笑话段子。
(话说小白在这上面找半天才看到段子藏在span里面,我一直觉得自己有点智障=_=)
注意:如果写find_all("span")可以抓取到段子的内容,但是还会包含网页上其他span的内容,所以我们还要往上一级标签看,
#coding=utf-8
from bs4 import BeautifulSoup
import requests
#使用requests抓取页面内容,并将响应赋值给page变量
html = requests.get('https://www.qiushibaike.com/text/')
#使用content属性获取页面的源页面
#使用BeautifulSoap解析,吧内容传递到BeautifulSoap类
soup = BeautifulSoup(html.content,'lxml')
links = soup.find_all('div',class_='content')
#link的内容就是div,我们取它的span内容就是我们需要段子的内容
for link in links:
print link.span.get_text()
运行结果:
2.select()方法
可以按标签逐层查找到我们需要的内容,这点特别方便,就是定位,避免了单一的标签无法定位到我们所需要的内容元素。
soup.select("html head title") #标签层级查找
soup.select("td div a") #标签路径 td-->div-->a
soup.select('td > div > a') #note:推荐使用这种记法
选择谷歌浏览器,右键copy --copy selector
赋值得到内容:
#qiushi_tag_120529403 > a > div > span:nth-child(1)
对于这个内容要改一下~按照标签顺序去搜索
div > a > div > span (我运行的时候发现一个问题,> 前后一定要有空格,不然会报错的)
然后代码如下:(和前面的代码区别只有后三行)
#coding=utf-8
from bs4 import BeautifulSoup
import requests
#使用requests抓取页面内容,并将响应赋值给page变量
html = requests.get('https://www.qiushibaike.com/text/')
#使用content属性获取页面的源页面
#使用BeautifulSoap解析,吧内容传递到BeautifulSoap类
soup = BeautifulSoup(html.content,'lxml')
#我是分隔符,下面就是select()方法咯~
links = soup.select('div > a >div >span')
for link in links:
print link.get_text()
运行结果:
啊哦~是不是发现和上面运行结果不一样,这里还匹配到了评论,所以:
我们还要对定位进行修改,让它更精确,改成从标签a 开始,并且加上它的class属性。a.contentHerf 是在select方法中的写法。
具体是这样的: a.contentHerf > div > span (把它改到代码第三行再运行就好了~)
吃饭去,结果就不贴啦~
note:1)例子只介绍了抓取一页的内容
2)代码都是在python2.7中运行的
---------------------
作者:诶呀吗_Bug