微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

笔记20210527解析器和selenium的使用

解析器和selenium的使用

  1. pyquery的使用

    from pyquery import PyQuery
    # 1.创建PyQuery对象
    # PyQuery
    # pq = PyQuery(需要解析的html字符串)
    html = open('test.html', encoding='utf-8').read()
    pq = PyQuery(html)   # pq对应的容器中只有一个html标签
    
    # 2.通过选择器获取标签
    # PyQuery对象(选择器)——获取css选择器选中的标签对应的pyQuery对象
    ps = pq('p')
    print(ps, type(ps))
    # 运行结果为:
    #     <p>我是p标签</p>
    #             <p>我是p2标签</p>
    #         <p>111111111</p>
    #         <p class="c1">222222222</p>
    #         <p>333333333</p>
    #         <p class="c1">444444444</p>
    #         <p>555555555</p>
    #         <p class="c2">666666666</p>
    #      <class 'pyquery.pyquery.PyQuery'> 
    
    # 在整个html中获取b标签(pq对应的容器中只有html一个标签)
    print(pq('b'))   # <b>加粗1</b><b>加粗2</b>
    # 在所有的p标签获取b标签(ps对应的容器中是整个页面中所有的p标签)
    print(ps('b'))   # <b>加粗1</b>
    
    # 选择ps中第一个p标签中的b标签
    print(f'ps中第一个元素类型{type(ps[0])}')   # ps中第一个元素类型<class 'lxml.html.HtmlElement'>
    print(ps[0])   # <Element p at 0x353a810>
    print(PyQuery(ps[0])('b'))   # <b>加粗1</b>
    # 或者
    p1 = PyQuery(ps[0])
    print(p1('b'))   # <b>加粗1</b>
    
    # 3.获取标签内容标签属性
    # PyQuery对象.text()——功能只对PyQuery类型起作用
    result = pq('h1').text()
    print(result)   # 标题1
    
    # 同时获取所有a标签内容
    result = pq('a').text()
    print(result)   # 百度 京东 爱奇艺
    
    # 单独获取a标签内容
    for a in pq('a'):
        print(PyQuery(a).text())
    # 结果为:
    # 百度
    # 京东
    # 爱奇艺
    
    # 4.获取标签属性
    # PyQuery对象.attr(属性名)
    # 获取一个a标签的href属性
    result = pq('a').attr('href')
    print(result)   # www.baidu.com
    
    # 获取每个a标签的href属性
    for a in pq('a'):
        print(PyQuery(a).attr('href'))   # www.baidu.com   www.jd.com
    
    
  2. xpath的使用

    # 主要用于解析数据
    from lxml import etree
    # 1.构建指定的树结构,并且获取根节点
    # html = etree.HTML(需要解析的网页数据)
    html = etree.HTML(open('test.html', encoding='utf-8').read())
    
    # 2.根据路径获取节点(标签)
    # 节点对象.xpath()——获取指定节点对应的所有节点对象对应列表
    a_list = html.xpath('/html/body/div/a')
    print(a_list)   # [<Element a at 0x2a8b500>, <Element a at 0x2a8b540>, <Element a at 0x2a8b580>]
    
    
    # 3.路径的写法
    # 1)绝对路径:/绝对路径
    # 注意:绝对路径必须从根节点开始写。
    result1 = html.xpath('/html/body/h1')
    result2 = a_list[0].xpath('/html/body/h1')
    print(f'result1:{result1}')   # result1:[<Element h1 at 0x2aba5c0>]
    print(f'result2:{result2}')   # result2:[<Element h1 at 0x2aba5c0>]
    
    # 2)相对路径
    result4 = html.xpath('./body/h1')   # 从当前节点开始
    print(result4)   # [<Element h1 at 0x2a85d00>]
    
    div = html.xpath('/html/body/div')[0]   # 只取第一个div节点
    print(div)   # <Element div at 0x2a86f80>
    
    # 绝对路径
    img1 = div.xpath('/html/body/div/img')
    print(img1)   # [<Element img at 0x2a89300>]
    
    # 相对路径(.表示当前节点,..表示当前节点的上层节点)(./可以省略)
    img2 = div.xpath('./img')
    print(img2)   # [<Element img at 0x2a89300>]
    
    # 路径的最后加/text()可以获取标签内容
    result5 = div.xpath('../b/text()')
    print(result5)   # ['加粗2']
    
    # 拿不到内部子标签内容
    p = html.xpath('./body/p/text()')
    print(p)   # ['段落1']
    
    # 3)//——全文检索
    # //p——获取整个页面所有的p标签对应的节点
    # //div/p——获取整个div下面的p标签
    result6 = html.xpath('//p')   # ['加粗2']
    
    result7 = div.xpath('//p')   # ['段落1']
    
    result8 = html.xpath('/html/body/div//p/text()')
    print(result8)   # ['我是p标签']
    
    result9 = div.xpath('.//p/text()')
    print(result9)   # ['我是p标签', '我是p2标签']
    
    # 3.获取内容属性
    # 获取内容——在路径最后加/text()
    # 获取属性——在路径后边加/@属性名
    result10 = html.xpath('//a/@href')
    print(result10)   # ['www.baidu.com', 'www.jd.com', 'www.aiqiyi.com']
    # 获取所有属性值
    result11 = html.xpath('//@id')
    print(result11)   # ['1', '2']
    
    # 4.谓语——筛选条件
    # [N]——获取第N个指定标签
    result = div.xpath('./a[1]/text()')
    print(result)   # ['百度']
    
    result = html.xpath('./body/div/p/text()')
    print(result)   # ['111111111', '2222222222']
    
    result = html.xpath('./body/div/p[1]/text()')
    print(result)    # ['111111111']
    
    # [last()]——最后一个
    # [last()-N]——倒数第N+1个
    result = html.xpath('./body/div[2]/p[position()<=4]/text()')  # 谓语是从1开始
    print(result)   # ['111111111', '222222222', '333333333', '444444444']
    
    # [@属性名]——拥有指定属性名的标签
    result = html.xpath('./body/div[2]/p[@class]/text()')
    print(result)   # ['222222222', '444444444', '666666666']
    
    # [@属性名=值]——指定属性是指定值的标签
    result = html.xpath('./body/div[2]/p[@class="c1"]/text()')
    print(result)   # ['222222222', '444444444']
    
    result = html.xpath('./body/div[1]/*/*/text()')
    print(result)   # ['我是p标签', '我是p2标签']
    
    result = html.xpath('//img/@*')
    print(result)   # ['https://', '警告', '名字']
    
    result = html.xpath('./body/div[1]/p/text()|./body/div[1]/a/text()')
    print(result)   # ['百度', '京东', '爱奇艺']
    
    
  3. selenium的使用

    from selenium import webdriver
    
    # 创建浏览器对象(谷歌浏览器)
    b = webdriver.Chrome()
    # b.get('https://www.douyu.com')
    b.get('http://baidu.com')
    print(b.page_source)
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐