• Python BeautifulSoup库使用


    目录

    1、BeautifulSoup库介绍:
    2、BeautifulSoup 使用步骤:
    3、选择器分类: 
    4、 CSS选择器: 
    

    1. BeautifulSoup库介绍:

    # BeautifulSoup库介绍: 
    BeautifulSoup也是一个解析库 
    BS解析数据是依赖解析器的, BS支持的解析器有html.parser, lxml, xml, html5lib等, 其中lxml 解析器解析速度快, 容错能力强. 
    BS现阶段应用的解析器多数是lxml
    

    2. BeautifulSoup 使用步骤:

    # BeautifulSoup 使用步骤: 
    from bs4 import BeautifulSoup 
    soup = BeautifulSoup(res.text, 'lxml')   #实例化BeautifulSoup对象
    tag = soup.select("CSS选择器表达式") # 返回一个列表
    

    3. 选择器分类:

    1).节点选择器 2).方法选择器 3).CSS选择器
    

    4. CSS选择器:

    # CSS选择器:
    1.根据节点名及节点层次关系定位标签: 标签选择器  &  层级选择器
    soup.select('title')
    soup.select('div > ul > li')   # 单层级选择器
    soup.select('div li')  # 多层级选择器
    
    
    2.根据节点的class属性定位标签: class选择器(classical:经典)
    soup.select('.panel')
    
    
    3.根据id属性定位标签: id选择器
    soup.select('#item')
    
    
    4.嵌套选择:
    ul_list = soup.select('ul')   #得到的依然是一个数据列表
    for ul in ul_list:
      print(ul.select('li'))
    
    # 获取节点的文本或属性:
    # 如果标签下除了直接子文本外还有其他标签,string将无法获取直接子文本
    tag_obj.string:         #获取直接子文本-->如果节点内有与直系文本平行的节点, 该方法拿到的是None
    tag_obj.get_text(): 	#获取子孙节点的所有文本
    tag_obj['attribute']:   #获取节点属性
    
    # 练习示例:
    from bs4 import BeautifulSoup
    html = '''
        <div class="panel">
            <div class="panel-heading">
                <h4>BeautifulSoup练习</h4>
            </div>
            <div>
            	这是一个div的直接子文本
            	<p>这是一个段落</p>
            </div>
            <a href="https://www.baidu.com">这是百度的跳转连接</a>
            <div class="panel-body">
                <ul class="list" id="list-1">
                    <li class="element">第一个li标签</li>
                    <li class="element">第二个li标签</li>
                    <li class="element">第三个li标签</li>
                </ul>
                <ul class="list list-small">
                    <li class="element">one</li>
                    <li class="element">two</li>
                </ul>
                <li class="element">测试多层级选择器</li>
            </div>
        </div>
    '''
    # 1.实例化BeautifulSoup对象
    soup = BeautifulSoup(html,'lxml')
    #2.条用css选择器定位标签,获取标签的文本或属性
    
    ### 2.1 根据节点名定位
    # r1 = soup.select('h4')
    # print(type(r1))
    # #列表用下标0取出第一个元素
    # print(r1[0].string)         #直接获取子文本
    # print(r1[0].get_text())     #直接获取所有的子孙文本
    
    ### 2.2 根据节点的class定位
    # k1 = soup.select('.panel-heading')
    # print(k1[0])
    
    ### 2.3根据id选择标签定位
    # k2 = soup.select('#list-1')
    # print(k2[0].get_text())
    
    ### 2.4单层级选择器
    # cc = soup.select('.panel-body > ul >li')
    # print(cc)
    
    ### 2.5多层级选择器
    # cc1 = soup.select('.panel-body li')
    # print(cc1)
    
    '''
    利用bs4语法,爬取三国演义文字
    '''''
    # import requests
    # from bs4 import BeautifulSoup
    #
    # url = 'http://www.shicimingju.com/book/sanguoyanyi.html'
    # headers = {
    #     'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'
    # }
    # res = requests.get(url=url,headers=headers)
    # soup = BeautifulSoup(res.text,'lxml')
    # ret = soup.select('.book-mulu ul li')
    # for i in ret:
    #     title = i.select('a')[0].string
    #     comment = 'http://www.shicimingju.com'+i.select('a')[0]['href']
    #     ret1 = requests.get(url=comment,headers=headers)
    #     res1 = BeautifulSoup(ret1.text,'lxml')
    #     cc = res1.select('.chapter_content ')[0].get_text()
    #     with open('threecountry.txt','a',encoding='utf-8') as f:
    #         f.write(cc+'
    ')
    
    '''
    利用xpath语法,爬取三国演义文字
    '''''
    import requests
    from lxml import etree
    url = 'http://www.shicimingju.com/book/sanguoyanyi.html'
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'
    }
    res = requests.get(url=url,headers=headers)
    tree = etree.HTML(res.text)
    ret = tree.xpath('//div[@class="book-mulu"]/ul/li')
    for i in ret:
        rec = i.xpath('./a/@href')[0]
        name = i.xpath('./a/text()')[0]
        url = 'http://www.shicimingju.com'+rec
        res1 = requests.get(url= url,headers=headers)
        tree1 = etree.HTML(res1.text)
        cope = tree1.xpath('//div[@class="chapter_content"]/p/text()')[0]+'
    '
        with open(name+'.txt','a',encoding='utf-8') as f:
            f.write(cope)
    
  • 相关阅读:
    poj2387Til the Cows Come Home(dijkstra)
    poj2349Arctic Network
    poj1789Truck History
    zoj1586QS Network
    poj2421Constructing Roads
    poj2301Building a Space Station(最小生成树)
    poj1287Networking(最小生成树)
    myeclipse配置svn亲测
    MyEclipse8.6安装svn(非link方式)
    myeclipse一些技巧
  • 原文地址:https://www.cnblogs.com/xinzaiyuan/p/12382221.html
Copyright © 2020-2023  润新知