【爬虫基础】CSS选择器,XPath选择器

XPath

什么是XPath?

  • xpath(XML Paht Language)是一门在XML和HTML文档中查找信息的语言,可用来在XML和HTML文档中对元素和属性进行遍历。

XPath开发工具

  • Chrome插件XPath Helper。
  • Fiefox插件Try XPath

XPath节点

  • 在XPath中,有7类节点:元素,属性,文本,命名空间,处理指令,注释以及文档(根)节点。XML文档是被作为节点树来对待的。树的根被称为文档节点或者根节点。

XPath语法

  • 最常用的表达式
表达式描述
/从根节点选取。或者是元素和元素间的过度
//从匹配选择的当前节点选择文档中的节点,而不考虑他们的位置
.选取当前节点
. .选取当前节点的父节点
@选取属性
text()选取文本
  • 路径表达式以及表达式的结果
表达式结果
bookstore选择bookstore元素
/bookstore选取根元素bookstore。注释:假如路径起始于正斜杠(/),则此路径始终代表到某元素的绝对路径
bookstore/book选取所有book子元素,而不管它们位于bookstore之下的什么位置
//book/title/@lang选择所有的book下面的title中的lang属性的值
//book/title/text()选择所有的book下面的title文本
/bookstore/*选取bookstore元素的所有子元素
//*选取文档中所有的元素
//title[@*]选取所有带属性的title元素
  • 选取未知节点
通配符描述
*匹配任何元素节点
@*匹配任何属性节点
node()匹配任何类型的节点

案例

html_str = """
        <div> 
            <ul> 
                <li class="item-1">
                    <a href="link1.html">第一个</a>
                </li> 

                <li class="item-2">
                    <a href="link2.html">第二个</a>
                </li> 

                <li class="item-3">
                    <a href="link3.html">第三个</a>
                </li> 

                <li class="item-4">
                    <a href="link4.html">第四个</a>
                </li> 

                <li class="item-5">
                    <a href="link5.html">第五个</a> 
                </li>
            </ul>
        </div>
"""
import parsel
# 转换数据类型
# 把 html 字符串数据转换成一个 Selector 对象
# Selector 就具有一系列数据解析的方法  css/xpath/re
data = parsel.Selector(html_str)
# 解析数据 list型
# 从根节点开始,获取所有<a>标签
res = data.xpath('/html/body/div/ul/li/a').getall()
# 跨节点获取所有<a>标签
res = data.xpath('//a').getall()
# 选取当前节点
res = data.xpath('//ul')
res2 = res.xpath('./li').getall()
res3 = res.xpath('./li/a').getall()
# 选取当前节点的父节点,获取父节点的class属性值
res = data.xpath('//a')
res4 = data.xpath('../@class').getall()
# 获取第三个<li>标签的节点
res = data.xpath('//li[3]').getall()
# 通过定位属性的方法获取第四个<a>标签
res = data.xpath('//a[@href="link4.html"]').getall()
# 用属性定位标签,获取第四个<a>标签的包裹的文本内容
res = data.xpath('//a[@href="link4.html"]/text()').getall()
# 获取第五个<a>标签的href的属性值
res = data.xpath('//li[5]/a/@href').getall()
# 了解模糊查询
res = data.xpath('//li[contains(@class,"it")]').getall()
# 同时获取<li>标签的属性以及<a>标签的文本
res = data.xpath('//li/@class|//a/text()').getall()
  • 通过路径表达式中使用 | 运算符,可以选取若干个路径。

总结

  1. xpath 的节点关系:根节点,子节点,同级节点
  2. xpath 的重点语法获取任意节点://
  3. xpath 的重点语法根据属性获取节点:标签[@属性=‘值’]
  4. xpath 中获取节点的文本:text()
  5. xpath 的获取节点属性值:@属性名

CSS选择器

选择器例子例子描述
.class.intro选择 class=“intro” 的所有元素
#id#name选择 id=“name” 的所有元素
**选择所有元素
elementp选择所有p元素
element,elementdiv,p选择所有div元素和p元素
element elementdiv p选择div内部的所有p元素
element>elementdiv>p选择父元素为div的所有p元素
[attribute][target]选择带有 target属性的所有元素
[attribute=value][target=_blank]选择target=“_blank” 的所有元素
:last-of-typep:last-of-type选择每个p元素是其父元素的最后一个p元素
:nth-child(n)p:nth-child(2)选择所有p元素的父元素的第二个子元素
:not(n):not( p)选择所有p以外的元素
:nth-last-child(n)p:nth-last-child(2)选择所有p元素倒数的第二个子元素

案例

标签选择器

# 简化的html标签
html = """
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>标签选择器</title>
</head>
<style>
    p{
        color: #f00;
        font-size: 16px;
    }
</style>
<body>
<p>css标签选择器的介绍</p>
<p>标签选择器、类选择器、ID选择器</p>
<a href="https://www.baidu.com">百度一下</a>
<span> 我是一个span标签</span>
</body>
</html>
"""
import parsel
# 把 html 字符串数据转换成一个 Selector 对象
# Selector 就具有一系列数据解析的方法  css/xpath/re
selector = parsel.Selector(html)
# 选取span 标签选择器,直接给标签的名字
# get() 从Selector 对象中提取第一个数据,直接返回字符串
# getall() 从Selector 对象中提取所有数据,返回一个列表
span = selector.css('span').get()
a = selector.css('a').getall()
print(span)
print(a)

类选择器

# 只有标签具有 class 属性才可以使用类选择器提取对应的标签
# . 代表提取的标签类型
# 具体相同属性的标签都会被提取
# 类选择器可以通过标签的类属性(class属性)精确定位到你想要的标签
p = selector.css('.top').getall()
print(p)

ID选择器

# id 这html中一般都是唯一的
# "#" 使用id选择器提取数据
# 只要标签具有id属性,那么具有id属性的标签会全部提取
# contend 代表id的属性值
p = selector.css('#contend').getall()
print(p)

属性选择器

# :: 表示属性选择器,当你提取到标签之后,需要对标签特定的值进行提取(标签包含的文本内容,标签的属性)
# text 提取标签包含的文本内容
p = selector.css('p::text').getall()
print(p)
# ::attr(href) 根据标签中包含的属性名字提取属性值
# href a标签的属性名字
a = selector.css('a::attr(href)').getall()
print(a)

伪类选择器

# : 表示伪类选择器
# nth-child 满足标签的第几个元素
# (2)选择满足标签的第二个元素,类似索引,从1开始取
p = selector.css('p:nth-child(2)::attr(class)').getall()
print(p)

组合选择器

  • 多个选择器一起使用
  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值