BS4 解析库的使用

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

安装:

bs4 简单使用

整体使用步骤:

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

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

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

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

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 = BeautifulSoup(content, 'lxml')
    
    oa_list = soup.select('.book-mulu > ul > li > a')
    
    
    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 = BeautifulSoup(content, 'lxml')
    
    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


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 = BeautifulSoup(content, 'lxml')
    
    odivbox = soup.find('div', id='resultList')
    
    odiv_list = odivbox.find_all('div', class_='el')[1:]
    
    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
        
        
        item = {
            '职位名称': jobname,
            '公司名称': company,
            '工作地点': area,
            '职位月薪': salary,
            '发布时间': publish_time
        }
        
        
        

        
        save_to_mysql(db, item)

def save_to_mysql(db, item):
    
    cur = db.cursor()
    
    sql = """insert into work(jobname,company,area,salary,publish_time) values('%s','%s','%s','%s','%s')""" % (item['职位名称'], item['公司名称'], item['工作地点'], item['职位月薪'], item['发布时间'])
    
    try:
        cur.execute(sql)
        
        db.commit()
    except Exception as e:
        
        
        db.rollback()

def main():
    
    
    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 = '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_page = url.format(keyword, page)
        
        
        request = handle_request(url_page)
        
        content = urllib.request.urlopen(request).read().decode('gbk')
        
        parse_content(content, db)
        print('结束爬取第%s页' % page)
        time.sleep(2)
    
    db.close()

if __name__ == '__main__':
    main()
© 版权声明
THE END
喜欢就支持以下吧
点赞0
分享
评论 抢沙发

请登录后发表评论