关于爬虫解析数据的4种方式 - 文章中心
关于爬虫解析数据的4种方式
2024-12-29

目录

关于爬虫解析数据的4种方式

一、XPath解析数据

1、XPath解析数据

2、XML的树形结构

3、使用XPath选取节点

4、XPath案例 

二、BeautifulSoup解析数据

1、BeautifulSoup

2、BeautifulSoup的使用

3、BeautifulSoup案例

三、正则表达式

1、正则表达式

2、正则语法

3、特殊序列

4、正则处理函数

5、正则案例1

6、正则案例2

四、pyquery解析数据

1、pyquery

2、pyquery的初始化方式

3、pyquery的使用

4、pyquery案例


  • XPath
    • 全称:XML Path Language是一种小型的查询语言
    • 是一门在XML文档中查找信息的语言
  • XPath的优点
    • 可在XML中查找信息
    • 支持HTML的查找
    • 可通过元素和属性进行导航
  • XPath需要依赖lxml库
    • 安装方式: pip install lxml

序号

表达式

描述

1

nodename

选取此节点的所有子节点

2

/

从根节点选择

3

//

从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置

4

.

选取当前节点

5

..

选取当前节点的父节点

6

/text()

选取当前路径下的文本内容

7

/@xxx

提取当前路径下标签的属性值

8

|可选符

可选择若干个路径//p|//div,在当前路径下选取所有符合条件的p标签和div标签

序号

表达式

描述

1

xpath('https://blog.csdn.net/weixin_45932368/article/details/body/div[1]')

选取body下的第一个div节点

2

xpath('https://blog.csdn.net/weixin_45932368/article/details/body/div[ last() ]')

选取body下最后一个div节点

3

xpath('https://blog.csdn.net/weixin_45932368/article/details/body/div[ last()-1 ]')

选取body下倒数第二个div节点

4

xpath('https://blog.csdn.net/weixin_45932368/article/details/body/div[ position()<3 ]')

选取body下前两个div节点

5

xpath('https://blog.csdn.net/weixin_45932368/article/details/body/div[ @class ]')

选取body下带有class属性的div节点

6

xpath('https://blog.csdn.net/weixin_45932368/article/details/body/div[ @class="main" ]')

选取body下class属性为main的div节点

7

xpath('https://blog.csdn.net/weixin_45932368/article/details/body/div[ price>35.00 ]')

选取body下price元素大于35的div节点

  • 下载谷歌浏览器XPath插件
  • 安装XPath插件
  • 使用XPath
 

  • BeautifulSoup
    • 是一个可以从HTML或XML文件中提取数据的Python库。其功能简单而强大、容错能力强、文档相对完善,清晰易懂
    • 非Python标准模块,需要安装才能使用
  • 安装方式
    • pip install bs4
  • 测试方式
    • import bs4
  • 解析器
    • BeautifulSoup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,如果不安装第三方解析器,则Python会使用默认浏览器

序号

解析器

使用方法

优点

缺点

1

标准库

BeautifulSoup(html,'html.parser')

内置标准库,速度适中,文档容错能力强

Python3.2版本前的文档容错能力差

2

lxml HTML

BeautifulSoup(html, 'lxml')

速度快,文档容错能力强

安装C语言库

3

lxml XML

BeautifulSoup(html, 'xml')

速度快,唯一支持XML

安装C语言库

4

html5lib

BeautifulSoup(html, 'html5lib')

容错能力最强,可生成HTML5

运行慢,扩展差

 
 
  • BeautifulSoup提取数据的常用方法

返回值类型

方法

功能

语法

举例

Tag

find()

提取满足要求的首个数据

bs.find(标签,属性)

bs.find('div', class_='books')

Tag

find_all()

提取满足要求的所有数据

bs.find_all(标签,属性)

bs.find_all('div', class_='books')

  • CSS选择题

功能

举例

通过ID查找

bs.select('#abc')

通过classa查找

bs.select('.abc')

通过属性查找

bs.select(a[' class="abc" '])

  • Tag对象

功能

举例

获取标签

bs.title

获取所有属性

bs.title.attrs

获取单个属性的值

bs.div.get('class')

bs.div['class']

bs.a['href']

 

 

  • 是一个特殊的字符序列,它能帮助用户便捷地检查一个字符串是否与某种模式匹配
  • Python的正则模块是re,是Python的内置模块,不需要安装,导入即可

序号

元字符

说明

1

.

匹配任意字符(不包括 )

2

^

匹配字符串的开头

3

$

匹配字符的末尾

4

*

匹配前一个元字符0到多次

5

+

匹配前一个元字符1到多次

6

?

匹配前一个元字符0到1次

7

{m}

匹配前一个字符m次

8

{m,n}

匹配前一个字符m到n次

9

{m,n}?

匹配前一个字符m到n次,并且取尽可能少的情况

10

\

对特殊字符进行转义

11

[]

一个字符的集合,可匹配其中任意一个字符

12

|

逻辑表达式“或”,比如 a|b 代表可匹配a或者b

13

(...)

被括起来的表达式作为一个元组。findall()在有组的情况下只显示组的内容

序号

元字符

说明

1

A

只在字符串开头进行匹配

2

b

匹配位于开头或者结尾的空字符串

3

B

匹配不位于开头或者结尾的空字符串

4

d

匹配任意十进制数,相当于[0-9]

5

D

匹配任意非数字字符,相当于[^0-9]

6

s

匹配任意空白字符,相当于[ fv]

7

S

匹配任意非空白字符,相当于[^ fv]

8

w

匹配任意数字、字母、下划线,相当于[a-zA-Z0-9_]

9

W

匹配任意非数字、字母、下划线,相当于[^a-zA-Z0-9_]

10

Z

只在字符串结尾进行匹配

11

[一-龥]

中文

序号

正则处理函数

说明

1

re.match(pattern, string, flags=0)

尝试从字符串的开始位置匹配一个模式,如果匹配成功,就返回一个匹配成功的对象,否则返回None

2

re.search(pattern, string, flags=0)

扫描整个字符串并返回第一次成功匹配的对象,如果匹配失败,就返回None

3

re.findall(pattern, string, flags=0)

获取字符串中所有匹配的字符串,并以列表的形式返回

4

re.sub(pattern, repl, string, count=0,flags=0)

用于替换字符串中的匹配项,如果没有匹配的项则返回没有匹配的字符串

5

re.compile(pattern[ ,flags ])

用于编译正则表达式,生成一个正则表达式(Pattern)对象,供match()和search()函数使用

 
 

爬取数据时,一定要记得先找F12代码,看看和爬取的数据是否一致,若一致,则可直接提取。

 

 

  • pyquery库是jQuery的Python实现,就能以jQuery的语法来操作解析HTML文档,易用性和解析速度都很好
  • 前提条件
    • 你对CSS选择器与jQuery有所了解
  • 非Python标准模块,需要安装
    • 安装方式
      • pip install pyquery
    • 测试方式
      • import pyquery
  • 字符串方式
  • url方式
  • 文件
 
 
 
 

序号

提取数据

举例

1

获取当前节点

doc('#main')

2

获取子节点

doc('#main').children()

3

获取父节点

doc('#main').parent()

4

获取兄弟节点

doc('#main').siblings()

5

获取属性

doc('#main').attr('href')

6

获取内容

doc('#main').html() doc('#main').text()

 

 

  I   II   III   IV