爬虫工程师xpath、css选择器 实用技巧总结

HTML文本转DOM树的两种方式

1、使用lxml.etree

from lxml import etree

html = etree.HTML(html_text)
html.xpath("//div[@class='tabslider']/ul")

2、使用scrapy团队开源的parsel库(推荐)

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  检查网页源码中是否存在

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值