解析网页数据

目录

前言

解析网页数据的技术

1.正则表达式

2.XPath

3.Beautiful Soup

4.JSONPath

正则表达式

1.元字符

2.预定义字符集

XPath语法


前言

        我们已将整个静态网页的源代码全部抓取下来(抓取静态网页数据),并且源代码包含了最终要提取的数据。这些数据分为非结构化数据和结构化数据两种。由于这两种数据各有各的特点,因此需要采用不同的技术进行解析,提取与目标有关的数据。本文将围绕着解析网页数据的相关知识进行详细讲解。

解析网页数据的技术

        Python中提供了多种解析网页数据的技术,包括正则表达式 、 XPath 、 Beautiful Soup 、 JSONPath。本文主要介绍正则表达式。

正则表达式XPathBeautiful SoupJSONPath

1.正则表达式

        正则表达式是一种文本模式,这种模式描述了匹配字符串的规则,用于检索字符串中是否有符合该模式的子串,或者对匹配到的子串进行替换正则表达式的优点是功能强大,应用广泛,缺点是只适合匹配文本的字面意义而不适合匹配文本意义。例如,正则表达式在匹配嵌套了 HTML内容的文本时,会忽略HTML内容本身存在的层次结构,而是将HTML内容作为普通文本进行搜索。

2.XPath

        XPath是XML路径语言,用于从HTML或XML格式的数据中提取所需的数据XPath适合处理层次结构比较明显的数据,它能够基于HTML或XML的节点树确定目标节点所在的路径,顺着这个路径便可以找到节点对应的文本或属性值。

3.Beautiful Soup

        Beautiful Soup 是一个可以从HTML或XML文件中提取数据的 Python库它同样可以使用XPath 语法提取数据,并且也在此基础上做了方便开发者的封装,提供了更多选取节点的方式。

4.JSONPath

        JSONPath的作用类似XPath,它也是以表达式的方式解析数据的,但只能解析JSON格式的数据。


若要解析纯文本,则可以选择正则表达式,若要解析 HTML或XML格式的数据,则可以选择正则表达式、XPath、 BeautifulSoup;若要解析JSON 格式的数据,则可以选择JSONPath 。为便于开发者使用这些技术,Python 提供了一些库或模块进行支持,包括re、lxml、bs4、jsonpath,其中re 模块支持正则表达式;lxml库和bs4 库支持XPath ; jsonpath 模块支持JSONPath。

正则表达式

        正则表达式是对字符串操作的一种逻辑公式,它会将事先定义好的一些特定字符,以及这些特定字符的组合,组成一个规则字符串,并且通过这个规则字符串表达对给定字符串的过滤逻辑。
        一条正则表达式也称为一个模式,使用每个模式可以匹配指定文本中与表达式模式相同的字符串。正则表达式由普通字符、元字符或预定义字符集组成,其中普通字符包括大小写字母和数字。

1.元字符

在正则表达式中,元字符是指具有特殊含义的专用字符,主要用于规定其前导字符在给定字符串中出现的模式。

元字符说明
.匹配任何一个字符(除换行符外)
^匹配字符串的开头
$匹配字符串的末尾
|连接多个子表达式,匹配与任意子表达式模式相同的字符串
[]字符组,匹配其中的出现的任意一个字符
-连字符,匹配指定范围内的任意一个字符
?匹配其前导字符0次或1次
*匹配其前导字符0次或多次
+匹配其前导字符1次或多次
{n}匹配其前导字符 n次
{m,n}匹配其前导字符 m~n次
()分组,匹配子组
2.预定义字符集

XPath语法

以一个XML文档bookstore.xml为例:

<?xml version="1.0" encoding="ISO-8859-1"?>
<bookstore>、
    <book>
        <title lang="eng">Harry Potter</title>
        <price>29.99</price>
    </book>
    <book>
        <title lang="eng">Learning XML</title>
        <price>39.95</price>
    </book>
</bookstore>

bookstore           # 选取 bookstore 的所有子节点

/bookstore           # 选取根节点 bookstore

bookstore/book         # 从根节点 bookstore 开始向下选取名为 book 的所有子节点

//book         # 从任意节点开始,选取名为 book 的所有子节点

bookstore//book         # 从 bookstore 的后代节点中选取名为 book 的所有子节点

//@lang            # 选取所有名为 lang 的属性节点

  • 29
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值