zoukankan      html  css  js  c++  java
  • python 极好用的解析 html 标签的模块

      记录下各种使用姿态

      测试的 html 代码:

    <html>
            <head>
                <title>Test</title>
            <body>
                <p class="title">
                    <b>Test</b>
                </p>
                <div name="ele" class="story">
                    "i'm a div"
                    <ul>
                        <li>
                            <a href="http://www.baidu.com" id="link1">
                                <img src="http://www.baidu.com" data-src='//www.baidu.com'>
                            </a>
                        </li>
                        <li>
                            <a href="http://www.baidu.com" id="link2">
                                <img src="data:image/jpg;base64,covijfklawefonva...">
                            </a>
                        </li>
                    </ul>
                </div>

      这里使用了 python 内置的解析器:

    soup = BeautifulSoup(html, 'html.parser')

      开始输出

    # 输出整个 html
    print '
    ', soup.prettify()

    # title 标签
    print '
    ', soup.title

    # title 标签名称
    print '
    ', soup.title.name

    # title 标签内容
    print '
    ', soup.title.string

    # title 标签的父级标签名称
    print '
    ', soup.title.parent.name

    # p 标签(首个 p)
    print '
    ', soup.p

    # p 标签名称
    print '
    ', soup.p.name

    # p 标签下的 b 标签
    print '
    ', soup.p.b

    # p 标签的 class 属性值,类型、数组首个值
    print '
    ', soup.p["class"], type(soup.p["class"]), soup.p["class"][0]

    # 首个 a 标签
    print '
    ', soup.a

    # 查找所有 a 标签, 类型数组
    a_arr = soup.find_all('a')
    for value in a_arr:
        print value

    # 查找 id = link2 的标签(特殊的标签属性可以不写 attrs)
    print '
    ', soup.find(id='link2')

    # 查找 class 是 title 的标签
    print '
    ', soup.find(attrs={'class': 'title'})

    # 查找 name 是 ele 的标签
    print '
    ', soup.find(attrs={'name': 'ele'})

    # 查找 img,获取相应属性值
    img_arr = soup.find_all('img')
    for value in img_arr:
        print '
       ', value['src']
        attrs = value.attrs
        for attr in attrs:
            print '
     ', attr
            if attr == 'data-src':
                print '
       ', value[attr]

    # 获取 div 标签下所有子节点
    print '
    ', soup.div.contents,

    # 获取 div 下第二个子节点
    print '
    ', soup.div.contents[1]

    # 获取 div 下第二个子节点
    print '
    ', soup.div.contents[1].li

    # 获取 b 标签的文本内容
    print '
    ', soup.b.get_text()

    # 获取无值属性再判断是否None
    print '
    ', soup.div.title, type(soup.div.title), soup.div.title == None, not soup.div.title

    # css 选择器 select()
    print '
    ', soup.select('b')

       最后,贴上测试代码

    # -*- coding: utf-8 -*-
    
    
    from bs4 import BeautifulSoup
    
    
    def main():
        html = '''
        <html>
            <head>
                <title>Test</title>
            <body>
                <p class="title">
                    <b>Test</b>
                </p>
                <div name="ele" class="story">
                    "i'm a div"
                    <ul>
                        <li>
                            <a href="http://www.baidu.com" id="link1">
                                <img src="http://www.baidu.com" data-src='//www.baidu.com'>
                            </a>
                        </li>
                        <li>
                            <a href="http://www.baidu.com" id="link2">
                                <img src="data:image/jpg;base64,covijfklawefonva...">
                            </a>
                        </li>
                    </ul>
                </div>
        '''
    
        soup = BeautifulSoup(html, 'html.parser')
        # 输出整个 html
        # print '
    ', soup.prettify()
        # title 标签
        # print '
    ', soup.title
        # title 标签名称
        # print '
    ', soup.title.name
        # title 标签内容
        # print '
    ', soup.title.string
        # title 标签的父级标签名称
        # print '
    ', soup.title.parent.name
        # p 标签(首个 p)
        # print '
    ', soup.p
        # p 标签名称
        # print '
    ', soup.p.name
        # p 标签下的 b 标签
        # print '
    ', soup.p.b
        # p 标签的 class 属性值,类型、数组首个值
        # print '
    ', soup.p["class"], type(soup.p["class"]), soup.p["class"][0]
        # 首个 a 标签
        # print '
    ', soup.a
        # 查找所有 a 标签, 类型数组
        # a_arr = soup.find_all('a')
        # for value in a_arr:
        #     print '
    ', value
        # 查找 id = link2 的标签(特殊的标签属性可以不写 attrs)
        # print '
    ', soup.find(id='link2')
        # 查找 class 是 title 的标签
        # print '
    ', soup.find(attrs={'class': 'title'})
        # 查找 name 是 ele 的标签
        # print '
    ', soup.find(attrs={'name': 'ele'})
        # 查找 img,获取相应属性值
        # img_arr = soup.find_all('img')
        # for value in img_arr:
        #     print '
       ', value['src']
        #     attrs = value.attrs
        #     for attr in attrs:
        #         print '
     ', attr
        #         if attr == 'data-src':
        #             print '
       ', value[attr]
        # 获取 div 标签下所有子节点
        # print '
    ', soup.div.contents,
        # 获取 div 下首个子节点
        # print '
    ', soup.div.contents[0]
        # 获取 div 下第二个子节点
        # print '
    ', soup.div.contents[1]
        # 获取 div 下第二个子节点
        # print '
    ', soup.div.contents[1].li
        # 获取 b 标签的文本内容
        # print '
    ', soup.b.get_text()
        # 获取无值属性
        # print '
    ', soup.div.title, type(soup.div.title), soup.div.title == None, not soup.div.title
        # not 取反
        # if not None:
        #     print None
        # css 选择器 select()
        print '
    ', soup.select('b')
    
    
    # file onload
    if __name__ == '__main__':
        main()
  • 相关阅读:
    【BUG】java.sql.SQLException: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone
    IntelliJ IDEA控制台输出中文乱码问题
    CMD命令
    MongoDB学习笔记
    MyBatis生成序列ID
    MongoDB配置问题
    正确处理下载文件时HTTP头的编码问题(Content-Disposition)
    SpringJPA主键生成采用自定义ID,自定义ID采用年月日时间格式
    Java根据经纬度算出附近正方形的四个角的经纬度
    gradle
  • 原文地址:https://www.cnblogs.com/guofan/p/10255522.html
Copyright © 2011-2022 走看看