爬虫数据解析-Beautifulsoup

数据解析-bs4

bs4非通用方法

代码说明

# 非通用方法:只能取一个值  四大对象 BeautifulSoup,Tag,NavigableString,Comment
# 转换类型  BeautifulSoup对象   'bs4.BeautifulSoup'
soup = BeautifulSoup(html_doc,'lxml') # 默认bs4调用lxml解析库,可主动设置bs4的解析库
# 解析使用 tag对象 'bs4.element.tag'
result = soup.a # 仅能获取第一个符合条件的标签
# 获取标签内容 NavigableString对象  'bs4.element.NavigableString'
result = soup.li.string # 获取li标签文本内容
result = soup.a['href'] # 获取a标签属性值
# 获取注释  Comment   'bs4.element.Comment'
result = soup.p.string  # 获取p标签属性值

# 格式化输出 会补全缺失标签
result = soup.prettify()

简单说明

"""非通用方法只能取一个值"""
def day7_bs_dot():
    
    html_doc = """
    <html>
    <head>
        <title>The Dormouse's story</title>
    </head>
    <body>
    <div class="menu-list">
    <p class='next'><!--111111111133--></p>
    <ul class="clearfix">
    <li class="navitem-index current active"><a href="/999">首页</a></li>
    <li ><a href="/guonei">国内</a></li>
    <li ><a href="/guoji">国际</a></li>
    <li ><a href="/mil">军事</a></li>
    </ul>
    </div>
    </body>
    """
    # 四大对象 BeautifulSoup,Tag,NavigableString,Comment

    # 转换类型  BeautifulSoup对象   'bs4.BeautifulSoup'
    soup = BeautifulSoup(html_doc,'lxml') # 默认bs4调用lxml解析库,可主动设置bs4的解析库

    # 格式化输出 会补全缺失标签
    result = soup.prettify()

    # 解析使用 tag对象 'bs4.element.tag'
    result = soup.head # 获取头部
    result = soup.li # 获取li标签  ,仅能获取第一个符合条件的标签

    # 获取内容 NavigableString对象  'bs4.element.NavigableString'
    result = soup.li.string # 获取li标签文本内容
    result = soup.a['href'] # 获取a标签属性值

    # 获取注释  Comment   'bs4.element.Comment'
    result = soup.p.string  # 获取a标签属性值

	print(result)
    print(type(result))

bs4通用方法

代码说明

# find 方法  返回符合查询条件的第一个标签
result = soup.find(name='li', attrs={'class': 'active'})
# find_all 方法 返回包含标签对象的列表
result = soup.find_all('li', limit=1)[0]
# select_one CSS的选择器
result = soup.select_one('.active')
# select CSS的选择器
result = soup.select('.active') #类选择器
result = soup.select('#one') # id选择器
result = soup.select('ul li.active') #后代选择器
result = soup.select('title,.active') #组选择器
result = soup.select('li[class="active"]') #属性选择器
# 获取标签内容
result = soup.select('li')[0].get_text()
# 获取标签属性值
result = soup.select('a')[0].get('href')

简单使用

 """通用方法 爬虫常用"""   
def day7_bs4_fun():  
    html_doc = """
        <html>
        <head>
            <title>The Dormouse's story</title>
        </head>
        <body>
        <div class="menu-list">
        <p class='next'><!--111111111133--></p>
        <ul class="clearfix">
        <li id="one" class="active"><a href="/999">首页</a></li>
        <li class="active"><a href="/guonei">国内</a></li>
        <li ><a href="/guoji">国际</a></li>
        <li ><a href="/mil">军事</a></li>
        </ul>
        </div>
        </body>

        """
    # 转换类型  BeautifulSoup对象   'bs4.BeautifulSoup'
    soup = BeautifulSoup(html_doc, 'lxml')  # 默认bs4调用lxml解析库,可主动设置bs4的解析库

    # find 方法  返回符合查询条件的第一个标签
    result = soup.find(name='p')  # 获取p标签
    result = soup.find(attrs={'class': 'active'})  # 获取a标签属性值
    result = soup.find(text='军事')  # 获取标签内容
    result = soup.find(name='li', attrs={'class': 'active'})

    # find_all 方法 返回包含标签对象的列表
    result = soup.find_all('li')
    result = soup.find_all('li', limit=1)[0] # 此为find源码
    result = soup.find_all(attrs={'class': 'active'})

    # select_one CSS的选择器
    result = soup.select_one('.active')

    # select CSS的选择器
    result = soup.select('.active') #类选择器
    result = soup.select('#one') # id选择器
    result = soup.select('ul li.active') #后代选择器
    result = soup.select('title,.active') #组选择器
    result = soup.select('li[class="active"]') #属性选择器

    # 获取标签内容
    result = soup.select('li')[0].get_text()
    # 获取标签属性
    result = soup.select('a')[0].get('href')

    print(result)

bs4实例

爬取****小说名,url,文案并保存为json

# 爬取****  小说名,url,文案并保存为json
class Day7Bs4Btc(object):
    def __init__(self):
        self.base_url = 'https://www.****.com/forum.php?mod=forumdisplay&fid=41&page={}'
        self.headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:106.0) Gecko/20100101 Firefox/106.0',
        }
        self.data_list = []
        self.detail_data_list = []

    def get_response(self, url):
        response = requests.get(url,headers=self.headers)
        data = response.content.decode()
        return data

    def parse_list_data(self,data,rule):
        """保存当前小说的url"""
        # 转类型
        soup = BeautifulSoup(data,'lxml')
        # 根据bs4解析
        # a_list = soup.select('#threadlisttableid')[0].select('.xst')
        a_list = soup.select('.xst')
        for item in a_list:
            title = item.get_text()
            url = 'https://www.***.com/' + str(item.get('href'))
            self.data_list.append({'title':title, 'url':url})
        # print(self.data_list)

    def parse_detail_data(self,title,url, data):
        """解析详情页的数据"""
        # 转类型
        soup = BeautifulSoup(data, 'lxml')
        # 根据bs4解析 获取文案
        detail = soup.select('.t_f')[0].get_text()
        self.detail_data_list.append({'title': title, 'url': url,'detail': detail})

    def save_data(self,data,file_path):
        # 将列表转为字符串
        data_str = json.dumps(data)
        with open(file_path, 'w', encoding='utf-8') as f:
            f.write(data_str)

    def start(self):
        # 拼接完整URL
        for i in range(1,6):
            #列表页请求
            url = self.base_url.format(i)
            # 发送请求
            data = self.get_response(url)
            # 做解析
            self.parse_list_data(data, 1)
            # 保存
        self.save_data(self.data_list, 'baidu.json')

        #发送详情页请求
        for data in self.data_list[4:]:
            detail_url = data['url']
            detail_title = data['title']
            detail_data = self.get_response(detail_url)

            #解析详情页数据
            self.parse_detail_data(detail_title,detail_url,detail_data)
        self.save_data(self.detail_data_list, 'detail.json')
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值