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,其中它的type
为checkbox
或class
为check
的对象:
//input[@type="checkbox"or@class="check"]
and
:获取所有input,其中它的type
为checkbox
、class
为check
的对象:
//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
-
构建soup:
soup = 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']
- key取值:
-
其他方法:
string
:获取某个标签下字符串,返回值就是字符串strings
:获取某个标签下的子孙非标签字符串,返回生成器stripped_strings
:获取某个标签下的子孙非标签字符串,并去掉空白,返回生成器get_text()
:获取某个标签下的子孙非标签字符串,返回字符串