BS4 解析库的使用

bs4:BeautifulSoup
作用:用来解析网页,提取指定数据的。提供的接口非常简单。使用起来人性化。所以用的比较多,但是bs4只能解析html格式的数据

安装:

pip install bs4

bs4简单使用

整体使用步骤:

bs4里面有一个类,BeautifulSoup,然后通过这个类将网页html格式字符串生成一个对象,然后通过对象的方法来进行查找指定元素

(1)将本地html文件转化为对象

soup = BeautifulSoup(open('soup.html', encoding='utf8'), 'lxml')

lxml :

是一个文件解析库,通过它的解析生成对象,是一个第三方库,需要安装,

安装

 pip install lxml
html.parser :

是python自带的一个文件解析库

eg:

soup = BeautifulSoup(open('soup.html', encoding='utf8'), 'lxml')

根据标签名查找

soup.a 只能查找得到第一个符合要求的节点,是一个对象,bs4自己封装类的对象

获取属性

soup.a.attrs 获取得到所有属性和值,是一个字典
soup.a.attrs['href'] 获取指定的属性值
soup.a['href'] 简写形式

获取文本

soup.a.string
soup.a.text
soup.a.get_text()

[注]如果标签里面还有标签,那么string获取就是空,而后两个获取的是纯文本内容

find_all方法

返回的是一个列表,列表里面都是节点对象

soup.find_all('a') 找到所有a
soup.find_all('a', limit=2) 提取符合要求的前两个a
soup.find_all(['a', 'li']) 查找得到所有的a和li
soup.find_all('a', class_='xxx')查找得到所有class是xxx的a
soup.find_all('li', class_=re.compile(r'^xiao'))
查找所有的class以xiao开头的li标签

select方法

id选择器 #dudu
类选择器 .xixi
标签选择器 div a h1

eg :

div #dudu .xixi a
空格:代表后面的节点是前面节点的子节点或者子孙节点
div > #dudu > a > .xixi

: 代表后面的节点是前面节点的子节点
返回的是一个列表,列表里面都是符合要求的节点对象
普通对象也能调用select方法,查找的是这个对象下面的内容

实例

爬取三国演义小说保存到文件

import urllib.request
from bs4 import BeautifulSoup
import time

def handle_request(url):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
    }
    request = urllib.request.Request(url, headers=headers)
    return request

def parse_content(content, fp):
    # 生成soup对象
    soup = BeautifulSoup(content, 'lxml')
    # 查找所有的章节链接和标题内容
    oa_list = soup.select('.book-mulu > ul > li > a')
    # print(len(oa_list))
    # 遍历列表,依次获取每一个链接和内容
    for oa in oa_list:
        # 获取链接
        href = 'http://www.shicimingju.com' + oa['href']
        # 获取标题
        title = oa.string
        print('正在下载--%s--......' % title)
        # 获取章节内容函数
        text = get_text(href)
        # 写入文件
        fp.write(title + '\n' + text)
        print('结束下载--%s--' % title)
        time.sleep(2)

# 提取得到章节内容
def get_text(href):
    # 构建请求对象
    request = handle_request(href)
    content = urllib.request.urlopen(request).read().decode('utf8')
    # 生成soup对象
    soup = BeautifulSoup(content, 'lxml')
    # 查找包含内容的div
    odiv = soup.find('div', class_='chapter_content')
    return odiv.text

def main():
    # 打开文件
    fp = open('三国演义.txt', 'w', encoding='utf8')
    url = 'http://www.shicimingju.com/book/sanguoyanyi.html'
    # 构建请求对象
    request = handle_request(url)
    # 发送请求,得到响应
    content = urllib.request.urlopen(request).read().decode('utf8')
    # 解析内容即可
    parse_content(content, fp)
    fp.close()

if __name__ == '__main__':
    main()

爬取51job求职网 保存到数据库

import urllib.request
from bs4 import BeautifulSoup
import time
import pymysql

# 根据url生成请求对象
def handle_request(url):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
    }
    request = urllib.request.Request(url, headers=headers)
    return request

# 解析内容
def parse_content(content, db):
    # 生成soup对象
    soup = BeautifulSoup(content, 'lxml')
    # 先找包含所有工作的div
    odivbox = soup.find('div', id='resultList')
    # 首先找到包含所有工作的div
    odiv_list = odivbox.find_all('div', class_='el')[1:]
    # print(len(odiv_list))
    for odiv in odiv_list:
        # 职位名称
        jobname = odiv.select('.t1 > span > a')[0]['title']
        # 公司名称
        company = odiv.select('.t2 > a')[0]['title']
        # 工作地点
        area = odiv.select('.t3')[0].string
        # 职位月薪
        salary = odiv.select('.t4')[0].string
        # 发布时间
        publish_time = odiv.select('.t5')[0].string
        # print(salary, publish_time)
        # 保存到字典中
        item = {
            '职位名称': jobname,
            '公司名称': company,
            '工作地点': area,
            '职位月薪': salary,
            '发布时间': publish_time
        }
        # 保存到文件中
        # string = str(item) + '\n'
        # fp.write(string)

        # 保存到mysql中
        save_to_mysql(db, item)

def save_to_mysql(db, item):
    # 获取游标
    cur = db.cursor()
    # 执行sql语句
    sql = """insert into work(jobname,company,area,salary,publish_time) values('%s','%s','%s','%s','%s')""" % (item['职位名称'], item['公司名称'], item['工作地点'], item['职位月薪'], item['发布时间'])
    # print(sql)
    try:
        cur.execute(sql)
        #提交
        db.commit()
    except Exception as e:
        # print(e)
        #错误回滚
        db.rollback()

def main():
    # fp = open('work.txt', 'w', encoding='utf8')
    # 链接数据库
    db = pymysql.connect(host="localhost", user="root", password="123456", db="qiangge", port=3306, charset='utf8')
    # 用户输入要搜索工作关键字
    keyword = input('请输入要搜索的关键字-')
    # 用户输入要爬取的起始和结束页码
    start_page = int(input('请输入要爬取的起始页码-'))
    end_page = int(input('请输入要爬取的结束页码-'))
    # 要拼接的起始url
    url = 'https://search.51job.com/list/010000,000000,0000,00,9,99,{},2,{}.html'
    # 写循环,每一页开始挨着爬取
    for page in range(start_page, end_page + 1):
        print('正在爬取第%s页......' % page)
        # 拼接url
        url_page = url.format(keyword, page)
        # print(url_page)
        # 构建请求对象
        request = handle_request(url_page)
        # 发送请求,得到响应
        content = urllib.request.urlopen(request).read().decode('gbk')
        # 解析内容
        parse_content(content, db)
        print('结束爬取第%s页' % page)
        time.sleep(2)
    # fp.close()
    db.close()

if __name__ == '__main__':
    main()
gfg.jpeg
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,383评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,522评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,852评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,621评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,741评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,929评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,076评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,803评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,265评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,582评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,716评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,395评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,039评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,027评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,488评论 2 361
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,612评论 2 350

推荐阅读更多精彩内容

  • 我从不怀疑写作大咖的文学功底,想让自己的文章好。就先写个几十万字再说,先读几千本书再谈。 有的人问,书读的多,文章...
    rain夏阅读 368评论 1 4
  • 今天是5月6日,星期天,天气晴 今天我和昕宝从单位出来直奔烘焙店,因为我们约好今天一起完成一道甜品--芒果千层。准...
    折颜桃花源阅读 259评论 0 2
  • canvas绘制 基本方法: canvas.drawArc ()//(扇形) canvas.drawCircle(...
    yangzai阅读 13,207评论 2 21
  • 夏洛长呼一口气,又捋了捋自己的胳膊,发现并没有什么异样。这几天的胆战心惊也是逐渐放了下来,看来自己确是不会再融化了...
    Typings阅读 217评论 0 0