Python爬虫—数据解析

本文对比了三种常见的网页解析技术:Python内置的Regexp正则表达式、XML路径语言(Xpath)和BeautifulSoup,介绍了它们的优缺点,以及在数据清洗和HTML/XML文档遍历中的应用实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

3种方式对比

解析工具解析速度使用难度
Regexp正则表达式最快最难
Xpath一般一般
BeautifulSoup最慢最简单

Regexp

  • 详情 Python内置模块专栏—re章节
  • 数据清洗:若正则表达式提取的文本含有空标签(如</br>),可用replace("</br>","")删除

Xpath

  • Xpath(XML path language)是一门在HTML\XML文档中查找信息的语言,可以用来在HTML\XML文档中对元素和属性进行遍历。

xpath语法

  • 选取节点:
    • /:若在最前边,代表从根节点选取,否则选择某节点下的某个节点
    • //:从全局选择节点,无论节点在哪个位置
    • .:从当前etree对象的当前节点往下选取,例如
      # 先获取所有的a对象
      hrefs = html.xpath('//a[@class="list_ti_txt"]')
      for href in hrefs:	# 从a对象开始,获取其href属性,注意必须加.
          # 获取onclick属性的内容,里面包含了部的id
          bu_id = href.xpath('./@onclick')
          # 获取部的name
          bu_name = href.xpath('./text()')
      
    • []:谓语。具体用法见下一条。
    • @:选取此节点的属性。
      • 若要获取某属性,@放在/后,如//a/@href
      • 若获取符合特定属性的标签,@必须放在[]中,如//a[@href=...]
    • text():获取标签的文本内容。
      • //div/title/text() -> 获取div下title标签的文本信息。
    • |:选取多个路径。
      • //div[@class='x'] | //div[@class='y'] :选取class='x’或’y’的所有div标签
    • nodename:选取此节点的所有子节点
  • 谓语:谓语用来查找某个特定的节点或者包含某个指定属性值的节点,被嵌套在[]
    • 序号://div/a[1] -> 获取div下的第1个a标签
    • 位置://div/a[last()] -> div下的倒数第1个a标签
    • 数量://div/a[position<3] -> 获取div下前面2个子元素
    • 属性://div/a[@href] -> 获取div下所有含href属性的a标签
    • 属性值://div/a[@href='baidu.com'] -> 获取div下所有href为’baidu.com’的a标签
  • 通配符
    • *:匹配任意节点。如//div* ->获取div下的所有子标签。
    • @*:匹配节点中的任意属性。//div[@*] -> 选取所有带有属性的div标签。
  • 运算符|, +, -, *, div, mod, =, !=, <, <=, >, >=,
  • 逻辑运算
    • or:获取所有input,其中它的typecheckboxclasscheck的对象:
      //input[@type="checkbox"or@class="check"]
    • and:获取所有input,其中它的typecheckboxclasscheck的对象:
      //input[@type="checkbox"and@class="check"]
  • contains函数:有时候某个属性包含了多个值,可以使用此函数,如//div[contains(@class,'job_detail')]

lxml语法

from lxml import etree
  • 从爬取的网页中解析:常用

    text = response.text		# text为response响应得到的文本
    # 解析成html,会补全text缺失的标签
    html = etree.HTML(text)
    # reg为Xpath语法,res就是解析后返回的结果
    res = html.xpath(reg)
    
  • 从本地html文件中解析:不常用

    text = response.text
    # 解析html,但不能自动补充缺失的标签
    html = etree.parse(text)
    res = html.xpath(reg)
    
  • 自定义解析器:etree.parse()默认使用XML解析器,所以碰到不规则的HTML代码时,会解析错误,这时就要自己创建HTML解析器

    text = response.text
    parser = etree.HTMLParser(encoding='utf-8')
    html = etree.parse(text,parser=parser)
    res = html.xpath(reg)
    

BeautifulSoup

from bs4 import BeautifulSoup
  • 构建soupsoup = BeautifulSoup(text, selector)

    • text: 要解析的文本
    • selector: 选择器类型,值如下:
      • 'lxml':效率高,使用较多
      • 'parse.html': 原始选择器,速度慢,使用较少
  • 提取标签: soup.find_all(node[, limit=None, **kwargs])

    • node:要提取的标签名
    • limit:限制提取的数量
    • **kwargs: 施加条件限制提取的标签。
      • soup.find_all('input',type='text'): 选择type='text'的input标签
      • 为了防止与关键字冲突,指定class,id要加后缀_,
        soup.find_all('div',class_='btn'):选择class='btn'的div标签
      • 也可将所有的属性及对应的值放在一个字典中作为参数传递
    # 1.获取所有dd标签
    dds = soup.find_all('dd')
    # 2.获取指定数量=2的dd标签
    dd = soup.find_all('dd', limit=2)[1]
    # 3.获取所有class='v1'的a标签
    links = soup.find_all('a', class_='v1')
    # 4.获取所有a标签的href属性
    hrefs = soup.find_all('a', limit=3)
    for href in hrefs:
        # 下标操作方式
        a = href['href']
        # attrs属性的方式
        a = href.attrs['target']
    
  • 获取属性a = soup.find_all('a',limit=1)

    • key取值:href = a['href']
    • attr:href = a.attrs['href']
  • 其他方法:

    • string:获取某个标签下字符串,返回值就是字符串
    • strings:获取某个标签下的子孙非标签字符串,返回生成器
    • stripped_strings:获取某个标签下的子孙非标签字符串,并去掉空白,返回生成器
    • get_text():获取某个标签下的子孙非标签字符串,返回字符串
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值