HTML解析大法
HTML解析大法:
一.正则表达式
1.模块主要函数
1 |
|
2.使用正则表达式对象
使用re.compile
将正则表达式编译成正则表达式对象,即可使用对象的方法(与上文search、match、findall用法大同小异)
3.子模式与Match对象
Match对象主要方法有group()(返回模式子内容),groups()(返回模式字内容元组),groupdict()(返回字典)
特别地,使用(?P<name>)可以为子模式命名
二.BeautifulSoup
1.对象种类
Tag
即HTML中尖括号扩起来的部分。其有两个重要的属性:name和attributes
name属性:
每个Tag的名字,包括title、a、h1等等。name属性可以被修改。
attributes属性:
每个Tag中包含等号,等号两边的内容(像字典一样)就是是attribute,可以使用类似python操作字典的方法操作属性,建议使用get。
②NavigableString
对Tag对象使用.string获得其中文字
####③BeautifulSoup
与Tag对象类似,只不过可以把BeautifulSoup对象看成整体的Tag
④comment
即HTML中的注释部分。在使用.string时会同时提取注释,所以使用时可以先判断类型:
1 |
|
2.BeautifulSoup的树结构
子节点
.content以及.children都可返回直接子节点,不同的是前者返回的是列表。
.descendants可以返回所有的子孙节点(返回的是可迭代对象)。
父节点
.parents返回父节点的可迭代对象。
兄弟节点
.next_sibling和.previous_sibing返回前一个和后一个兄弟节点。
find_all方法
1 |
|
name参数:
寻找名字为name的标记
kwargs
查找参数符合条件的标记
例如:find_all('a',class_='post-title')
寻找参数class为post-title的标记
text
搜索文档中的字符串内容。
limit
限制搜索结果的个数。
recursive
默认为true,若为false,则只寻找当前节点的直接子节点。
三.lxml的xpath解析
lxml库的使用方法
1 |
|
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进行复制(仅适用于提取单个元素的情况)