zoukankan      html  css  js  c++  java
  • (最全)Xpath、Beautiful Soup、Pyquery三种解析库解析html 功能概括

    一、Xpath 解析

    代码有不明白的 欢迎来微信公众号“他她自由行”找我,回复任何话都可以 我都会回你哒~

      xpath:是一种在XMl、html文档中查找信息的语言,利用了lxml库对HTML解析获取数据。

    Xpath常用规则:

    nodename :选取此节点的所有子节点
    //  :从当前节点选取子孙节点
    / :从当前节点选取子节点
     .   :  选取当前节点
     ..  :  选取当前节点父节点
    @ : 选取属性
    
    1.初始化html

    etree.parse()是初始化html构造一个XPath解析对象;
    etree.tostring()是修复html文件中代码,把缺的头或尾节点补齐;
    result.deode('utf-8')修复后的HTML代码是字节类型,转化成字符串;

    from lxml import etreed
    
    html=etree.parse('c:/.../test.html',etree.HTMLParser())
    result=etree.tostring(html)
    result.decode('utf-8')
    
    2.获取所有节点

    Xpath规则一般用 // 开头

    例:
    html.xpath('//*') //获取所有的节点
    html.xpath('//li') //获取所有li节点
    
    3.子节点、子孙节点
    html.xpath('//li/a')  //所有li下是所有直接a子节点
    html.xpath('//ul//a') //所有ul下的子孙a节点
    
    4.父节点
    html.xpath('//a[@href="links.html"]/../@class')
     //找到所有a节点中href为links.html的父节点的class值
    // ..  来实现查找父节点
    
    5.属性匹配
    html.xpath('//li[@class="item-0"]') //找到class值为item-0是节点
    
    6.文本获取
    html.xpath('//li[@class="item-0"]/a/text()')
    或html.xpath('//li[@class="item-0"]//text()')
    
    7.属性获取
    html.xpath('//li/a/@href')  //找到li下a中的href属性值
    
    8.属性多值匹配
    html.xpath('//li[contains(@class,"li")]/a/text()')    //只要节点属性class中包含li就能匹配出来
    
    9.多属性匹配
    html.xpath('//li[contains(@class,"li") and @name="item"]/a/text()') //匹配节点属性class值为li,name值为item的节点
    

    二、Beautiful Soup 解析

    Beautiful Soup是HTML或XML解析库。通过解析文档为用户提供需要抓取的的数据。

    需要解析器:lxml HTML解析库、lxml XML解析库、Python标准库、html5lib

    基本用法:

    from bs4 import BeautifulSoup
    soup=BeautifulSoup(html,'lxml')
    
    1.soup.prettify()

    调用prettify()方法把要解析的字符串以标准的缩进格式输出

    2.节点选择器:

    例:soup.title.string

    (1)选择元素:
     soup.title、soup.title.sring soup.head soup.p
    (2)提取信息:
      1)获取节点名称:soup.title.name
      2) 获取属性:soup.p.attrs、soup.p.attrs['name']
      3) 获取内容:soup.p.string
    (3)嵌套选择:
    soup.head.title.string
    (4)关联选择:
      enumerate()    //生成器类型
    
    (1)soup.p.contents       //p节点下的直接子节点列表
    (2)soup.p.descendants    //p节点下的所有子孙节点(生成器类型)
    (3)父节点和祖先节点:soup.p.partent、soup.p.parents
    (4)兄弟节点:
       soup.a.next_sibling
       soup.a.previous_sibling
       soup.a.next_siblings
       enumerate(soup.a.pervious_siblings)
    (5)提取信息:soup.a.next_sibling.string
    
    3.方法选择器:

    find_all(name,attrs,recursive,text,**kwargs)

    (1)name:find_all(name='li')
    (2)attrs:find_all(attrs={'id':'list-1'})、find_all(class_='element')
    (3)text:匹配节点的文本,find_all(text='字符串或正则表达式')
    

    特:find()用法与fand_all一样,只不过只匹配第一个元素

    4.css选择器

    调用select()方法,传入相应css选择器

    soup.select('.panel.panel-heading')
    soup.select('ul li') //所有ul下的所有li
    soup.select('#list-2.element')
    
    (1)嵌套选择:
    for ul in soup.select('ul'):
        ul.select('li')
    (2)获取属性:
    for ul in soup.select('ul')
        ul.attrs['id']
        ul['id']
    (3)获取文本:
    for li in soup.select('li'):
        li.get_text()
        lli.string
    

    三、 pyquery 解析

    1.初始化:
    (1)字符串初始化:

    html=''' *******
         '''
    from pyquery import PyQuery as pq
    doc=pq(html)
    print(doc('li'))
    

    (2)URL初始化
    doc=pq(url=" https:/ ... ")

    (3)文件初始化
    doc=pq(filename='demo.html')
    print(doc(li))

    2.基本css选择器
    doc('#container .list li')    //id 为container,class为list下的所有li
    
    3.查找节点
    (1)子孙节点、子节点
    .find():查找所有子孙节点
    items=doc('.list')
    items.find('li')
    
    .children():查找子节点
    items=doc('.list')
    items.children('.active')
    
    (2)父节点
    doc=pq(html)
    items=doc('.list')
    items.parent()
    祖先节点
    items.parents()
    
    (3)兄弟节点
    doc=pq(html)
    li=doc('.lsit .item-0.active')
    li.siblings('.active')
    
    4.遍历

    用items()函数生成列表生成器进行遍历

    doc=pq(html)
    lis=doc('li').items()
    for li in lis:
      print(li)
    
    5.获取信息
    (1)获取属性
    a=doc('.item-0.active a')
    print(a.attr('href'))或print(a.attr.href)
    特:attr只会输出第一个a节点属性,要用items()遍历
    
    (2)获取文本
    .text()
    a=doc('.item-0.active a')
    a.text() //text()函数会输出所有的li文本内容
    
    .html()
    li=doc('li')
    li.html() //html()只会输出第一个li节点内的HTML文本
    
    6.节点操作
    (1) removeClass addClass
    li=doc('.item-0.active')
    print(li)
    li.removeClass('active')   //移除active的class
    li.addClass('active')    //增加active的class
    
    (2) attr text html
    li.attr('name','link')    //增加属性name=link
    li.text('changed item')   //改变文本 changed item
    li.html(<span>changed item </span>)   //改变HTML
    
    (3) remove()
    wrap=doc('.wrap')
    wrap.find('p').remove() //删除wrap中p节点
    wrap.text()
    

    特:伪类选择器
    选择第一个节点,最后一个节点,奇偶数节点,包含某一文本节点

    代码有不明白的 欢迎来微信公众号“他她自由行”找我,回复任何话都可以 我都会回你哒~
  • 相关阅读:
    Linux中使用dd制作文件的.img
    python正则表达式
    使用@property
    Win10添加删除虚拟打印机方法
    jenkins权限
    RedHat7.2下Jenkins的安装配置
    jenkins忘记管理员账号密码的补救方法
    RHEL软件安装
    docker 常用指令(RHLE)
    /var/run/yum.pid 已被锁定,PID 为 4242 的另一个程序正在运行
  • 原文地址:https://www.cnblogs.com/xubin97/p/10353670.html
Copyright © 2011-2022 走看看