HTML解析大法

HTML解析大法:

一.正则表达式

1.模块主要函数

1
2
3
4
5
6
7
8
9
import re
#创建正则表达式对象
re.compile(pattern)
#在字符串中寻找模式,返回match对象或None
re.search(pattern,string)
#从字符串开头匹配,返回match或None
re.match(pattern,string)
#返回列表
re.findall(pattern,string)

2.使用正则表达式对象

使用re.compile将正则表达式编译成正则表达式对象,即可使用对象的方法(与上文search、match、findall用法大同小异)

3.子模式与Match对象

Match对象主要方法有group()(返回模式子内容),groups()(返回模式字内容元组),groupdict()(返回字典)

特别地,使用(?P<name>)可以为子模式命名

二.BeautifulSoup

1.对象种类

Tag

即HTML中尖括号扩起来的部分。其有两个重要的属性:nameattributes
name属性:
每个Tag的名字,包括title、a、h1等等。name属性可以被修改。
attributes属性:
每个Tag中包含等号,等号两边的内容(像字典一样)就是是attribute,可以使用类似python操作字典的方法操作属性,建议使用get。

②NavigableString

对Tag对象使用.string获得其中文字
####③BeautifulSoup
与Tag对象类似,只不过可以把BeautifulSoup对象看成整体的Tag

④comment

即HTML中的注释部分。在使用.string时会同时提取注释,所以使用时可以先判断类型:

1
2
if type(soup.a.string) == bs4.element.comment:
print(soupa.a.string)

2.BeautifulSoup的树结构

子节点

.content以及.children都可返回直接子节点,不同的是前者返回的是列表。
.descendants可以返回所有的子孙节点(返回的是可迭代对象)。

父节点

.parents返回父节点的可迭代对象。

兄弟节点

.next_sibling和.previous_sibing返回前一个和后一个兄弟节点。

find_all方法

1
find_all(name, attrs, recursive, text, **kwarg)

name参数:

寻找名字为name的标记

kwargs

查找参数符合条件的标记
例如:find_all('a',class_='post-title')寻找参数class为post-title的标记

text

搜索文档中的字符串内容。

limit

限制搜索结果的个数。

recursive

默认为true,若为false,则只寻找当前节点的直接子节点。

三.lxml的xpath解析

lxml库的使用方法

1
rest = etree.HTML(html)

XPath节点

XPath的节点关系类似BeautifulSoup,都是树的结构,此处不再赘述。

XPath语法

表达式 描述
nodename 选取此节点的所有子节点
/ 从根节点选取
// 选择任意位置的某个节点
. 选取当前节点
选取当前节点的父节点
@ 选取
谓语 描述
/classroom/student[1] 选取classroom子元素的第一个student元素
/classroom/student[last()] 选取classroom子元素中的最后一个student元素
/classroom/student[position()<6] 选取classroom子元素的前五个元素
//name[@lang] 选取name元素,其必须有lang属性
//name[@lang=‘en’] 选取name元素,其lang属性的值必须为en
//student[age>20] 选取所有student,其age属性必须大于20

除此之外Xpath还可以在表达式中使用/text()来提取其中的字符(类似bs的.string)
Selector对象还有extract()方法,获取其中的文字。

###偷懒小技巧
在浏览器的审查元素中可以右键对元素的XPath进行复制(仅适用于提取单个元素的情况)


HTML解析大法
http://zhouhf.top/2022/01/17/HTML解析大法/
作者
周洪锋
发布于
2022年1月17日
许可协议