鱼C论坛

 找回密码
 立即注册
查看: 2098|回复: 0

[技术交流] [1]BeautifulSoup库入门详解之CSS选择器篇

[复制链接]
发表于 2019-7-26 14:46:45 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 MadJoker 于 2019-7-26 15:29 编辑

第一节 CSS选择器基本说明
[1] .和#
官方文档的作者站在了一个较高的角度来讲解了CSS选择器的基本使用,他几乎是默认看这个文档的人都是学过”网页三剑客”的(即html,css,JavaScript。推荐所有学爬虫的小白都去了解一下),所以以至于有些小白一看到CSS选择器就头疼,又是. 又是#的。这里需要说一下. 代表类,#代表id。而如果直接想选中一个标签标签,例如div标签的话,则直接输入该标签的名称即可。

[2]select()方法
该方法会根据条件筛选对应的内容,并且以列表的形式返回,列表中的每一个元素的类型都为bs4.element.Tag类[注:哪怕筛选出的元素只有一个,也会将该元素以列表的形式返回!!!]

  1. html="""
  2. <div class="FishC" id="FishC">这是一个div标签</div>
  3. <a class="MadJoker" id="FishC">这是一个a1标签</a>
  4. <a class="Python" id="MadJoker">这里是一个a2标签</a>
  5. <p class="FishC" id="MadJoker">这里是一个p1标签</p>
  6. <p class="Python" id="MadJoker">这里是一个p2标签</p>
  7. """
复制代码


问题一:如果我想在下面的HTML代码中分别选中其中的div标签,类名为FishC的标签,id为MadJoker的标签,那么我该怎么做呢?

问题一代码:
  1. from bs4 import BeautifulSoup as bs
  2. soup = bs(html,'lxml')
  3. div = soup.select('div')
  4. p1 = soup.select('.FishC')
  5. p2 = soup.select('#MadJoker')
  6. print(div)
  7. print(type(div))
  8. print(type(div[0]))
  9. print('------------------------------------------')
  10. print(p1)
  11. print('------------------------------------------')
  12. print(p2)
复制代码

s1.png

[3]交集选择器
作用:可以选中同时满足多个选择器的元素
语法:selec(选择器1选择器选择器N)

问题二:依然是刚才的HTML代码,虽然筛选出lid为MadJoker的标签,但是id为MadJoker的标签实在太多啦,假如我想选中最后的那条p标签,即<p class="Python" id="MadJoker">这里是一个p2标签</p>,那么我又该怎么做呢?
这时候就需要用到我们的交集选择器,通过观察我们可以看到,这条p标签有三个特征:(1)它是一个p标签(2)它的类名为Python,id为MadJOKoker(3)整个HTML中一共有2个p标签,而它是第二个p标签。

问题二代码(利用交集选择器):
  1. from bs4 import BeautifulSoup as bs
  2. soup = bs(html,'lxml')
  3. p = soup.select('p.Python#MadJoker')
  4. print(p)
复制代码

s1.png

问题二代码(直接选择):
  1. from bs4 import BeautifulSoup as bs
  2. soup = bs(html,'lxml')
  3. p = soup.select('p')[1]
  4. print(p)
复制代码



[4]并集选择器
通过选择器分组可以同时选中多个选择器对应的元素
语法:select(选择器1,选择器2,选择器N)

问题三:依然是刚才的HTML代码,假如这次我想选择出所有的div标签以及所有的a标签,那么我该怎么做?答案显而易见,肯定是我们的并集选择器啦!

问题三代码:
  1. from bs4 import BeautifulSoup as bs
  2. soup = bs(html,'lxml')
  3. all = soup.select('div,a')
  4. print(all)
复制代码

3.png

[小练习]选择如上HTML代码中id为FishC的a标签以及类名为FishC的p标签[提示:交集选择器和并集选择器一起用]

小练习答案代码:
  1. from bs4 import BeautifulSoup as bs
  2. soup = bs(html,'lxml')
  3. practice = soup.select('a#FishC,p.FishC')
  4. print(practice)
复制代码

练习题.png

[5]子孙选择器
  1. html="""
  2. <body>
  3. <div id="d1">
  4. <span>我是div标签中的span</span>
  5. <p><span>我是p标签中的span</span></p>
  6. </div>
  7. <div>
  8. <span>我是body中的span元素</span>
  9. </div>
  10. </body>
  11. """
复制代码

这里需要简单说明一下,什么是子,什么是孙?在HTML中除了自结束标签,其他所有的标签的组成都是<XXX>内容</XXX>,在这个XXX标签的内容中,嵌套的所有标签,我们都称其为XXX标签的后代,其中直接被嵌套的为'子',在'子'中又嵌套的标签则为'孙',如上所示的代码中body标签中直接嵌套了两个div子标签,而在这两个div标签中有分别嵌套了p标签和span标签,这些又嵌套在子标签div中的标签,我们就称之为'孙'

(1)后代元素选择器
作用:筛选出所有符合筛选条件的后代标签(包含孙级)
语法:selec(选择器1 选择器2 选择器N)

问题四:我该如何选择id为d1的div标签中的span标签呢?
问题四代码:
  1. from bs4 import BeautifulSoup as bs
  2. soup = bs(html,'lxml')
  3. all_span = soup.select('#d1 span')
  4. print(all_span)
复制代码

span标签.png

(2)子元素选择器
作用:筛选出所有符合筛选条件的'子标签'
语法:selec(选择器1>选择器2>选择器N)

问题五:在(1)中我们已经筛选出了在id为d1的div标签内部的所有后代标签,但是现在我们只想选择<span>我是div标签中的span</span>这条标签该怎么办呢?通过观察,我们可以发现该标签有一个特点:该标签为是id为d1的div标签的子标签,而另一条是'孙'级标签,所以,解决办法自然不言而喻
问题五代码:
  1. from bs4 import BeautifulSoup as bs
  2. soup = bs(html,'lxml')
  3. son_span = soup.select('#d1>span')
  4. print(son_span)
复制代码

问题五.png


[6]select_one()方法
该方法与前面的select_one方法区别并不大,前面所讲解的选择器的使用在这里依然适用,不同之处在于select_one只会返回符合选择条件的第一个元素,其类型为bs4.element.Tag类,由于差别不大,所以下面只举一个简单的小例子,大家体会一下就行了,不再一一赘述,依然是最上面的HTML代码!!!

示例代码:
  1. from bs4 import BeautifulSoup as bs
  2. soup = bs(html,'lxml')
  3. all_a = soup.select('a')
  4. print(all_a)
  5. print('--------------------------------------')
  6. first_a = soup.select_one('a')
  7. print(first_a)
  8. print(type(first_a))
复制代码

5.png



小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-9-26 02:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表