HTML文本转DOM树的两种方式
1、使用lxml.etree
from lxml import etree
html = etree.HTML(html_text)
html.xpath("//div[@class='tabslider']/ul")
2、使用scrapy团队开源的parsel库(推荐)
from parsel import Selector
# 构建DOM树
html = Selector(text=html_text or xml_text)
'''
解析结果的获取,只适用于parsel解析
'''
# 返回单个字符串
html.xpath("...").get()
html.xpath("...").extract_first()
# 返回结果列表
html.xpath("...").getall()
html.xpath("...").extract()
# 获取节点属性
html.xpath("...").attrib # 返回字典
html.xpath("...").attrib["href"] # 获取属性值
# 使用正则进行截取
html.xpath("...").re_first("\d+")
爬虫一般都是使用requests库获取网页源码,再使用xpath进行解析,有时候会遇到乱码问题,可以尝试如下方式:
res = requests.get(url, headers={...})
selector = Selector(text=res.content.decode("utf-8"))
注:
1、xpath解析默认是从 根节点 开始,加上 “.” 表示从 当前节点 开始
2、// 表示检索所有 子孙 节点, / 表示检索所有 子 节点
Xpath实用技巧(后续更新)
# 多个表达式, ele表示当前所选元素
ele.xpath("//ul//a/text() | //li/@class")
# 选择节点的特定子元素(不是子孙元素),child是xpath默认的轴
# 平时省略不写,知道有这东西存在就行了 >_<
ele.xpath("//ul/child::*")
ele.xpath("//ul/child::li")
# 使用position定位
ele.xpath('//li[@class="cxs" and postion()>1]')
# count统计节点的数量
ele.xpath("//ul[count(li)]")
# 获取节点及子孙节点所有本文
ele.xpath("//span//text()") # 返回列表
ele.xpath("string(//li[@class])") # 返回字符串
CSS选择器
获取 奇数 | 偶数 节点
# 奇数节点
ele.css("ul li:odd")
# 偶数节点
ele.css("ul li:even")
排除第一个子节点
# 例如取 tr 标签的 th 标签
ele.css("tr>th:not(:first-child)")
first-child和first-of-type区别
# div中的第一个子元素
div:first-child
# div中的第一个p元素
div p:first-of-type
# 第几个指定元素
div.cxs:nth-child(n)
关于tbody标签
在解析列表数据时间,在审查元素中发现 <tbody> 标签时
<table>
<tbody>
<tr>...</tr>
<tr>...</tr>
先别急着在xpath规则中加入tbody标签,先 Ctrl + U 检查网页源码中是否存在