python-数据解析-bs4介绍

发布时间 2024-01-05 23:15:52作者: zhang0513

一、数据解析方式-bs4

1、  爬虫数据的解析常用方式有三种:

   1、正则表达式

   2、bs4

   3、xpath解析

2、本次主要学习bs4,首先要先准备好环境,即要安装使用beautiful Soup,这里已经安装好了bs4模块,如下:

 pip install bs4 和 pip install lxml

 3、通过一个实例理解bs4的用法:

<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <title>Title</title>
    </head>
    <body>
        <div class="url">
            <ul>
                <li><a href="http://www.baidu.com">百度</a></li>
                <li><a href="http://www.google.com">谷歌</a></li>
                <li><a href="http://www.sogou.com">搜狗</a></li>
            </ul>
            <ol>
                <li><a href="feiji">飞机</a></li>
                <li><a href="dapao">大炮</a></li>
                <li><a href="huoche">火车</a></li>
            </ol>
        </div>
        <div class="job">李嘉诚</div>
        <div class="common">胡辣汤</div>
    </body>
</html>

如下:

from bs4 import BeautifulSoup  #导入bs4
if __name__=="__main__":
    # 将本地的html文档中的数据加载到该对象中
    file = open('b.html', encoding='utf-8')
    soup = BeautifulSoup(file,'lxml')

  print(soup.ul)         #返回ul所有内容
    # < ul >
    # < li > < a
    # href = "http://www.baidu.com" > 百度 < / a > < / li >
    # < li > < a
    # href = "http://www.google.com" > 谷歌 < / a > < / li >
    # < li > < a
    # href = "http://www.sogou.com" > 搜狗 < / a > < / li >
    # < / ul >
print(soup.div)      #等同于print(soup.find('div'))
#具体定位到某一个div,可根据属性定位
print(soup.find('div',class_='common')) #<div class="common">胡辣汤</div>
# 属性定位
soup.findAll('tagName') #返回soup中符合要求的所有标签
a_list = soup.findAll('a') #返回的是一个列表
for a in a_list:
print(a)
print(soup.findAll('a')[1]) #定位第2a标签的内容
# <a href="http://www.google.com">谷歌</a>

# select选择器:
# -select('某种选择器(id,class ,标签。。。选择器)’)
print(soup.select('.common')) #返回login下的所有标签 :[<div class="common">胡辣汤</div>]
print(soup.select('div')[1]) #返回一个列表 :<div class="job">李嘉诚</div>

#  层级选择器
# soup.select('.tag > ul > li > a')[1]#:表示的一个层级,不能在里写所有,
print(soup.select('.url > ol > li > a '))
# [<a href="feiji">飞机</a>, <a href="dapao">大炮</a>, <a href="huoche">火车</a>
#一个>表示一个层级
print(soup.select('.url > ul > li > a')[0]['href'])
# http://www.baidu.com
print(soup.select('.url ul a'))  #[<a href="http://www.baidu.com">百度</a>, <a href="http://www.google.com">谷歌</a>, <a href="http://www.sogou.com">搜狗</a>]
print(soup.select('.url ol li a')) #[<a href="feiji">飞机</a>, <a href="dapao">大炮</a>, <a href="huoche">火车</a>]
获取标签的文本数据
#text/get.text()  可以获取某一个标签中所有内容
#string :获取直系标签的内容
print(soup.find('div',class_= 'url').text)  #获取一个url下的所有的值
百度
谷歌
搜狗
飞机
大炮
火车
#获取某一个元素的值
print(soup.find('div',class_= 'job').string) #李嘉诚

获取属性的值比如href
# 1、查找所有的<a>标签元素,2、打印每个<a>标签的href属性值
links = soup.findAll('a')
for link in links:
print(link['href'])