|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 MadJoker 于 2019-7-26 15:29 编辑
第一节 CSS选择器基本说明
[1] .和#
官方文档的作者站在了一个较高的角度来讲解了CSS选择器的基本使用,他几乎是默认看这个文档的人都是学过”网页三剑客”的(即html,css,JavaScript。推荐所有学爬虫的小白都去了解一下),所以以至于有些小白一看到CSS选择器就头疼,又是. 又是#的。这里需要说一下. 代表类,#代表id。而如果直接想选中一个标签标签,例如div标签的话,则直接输入该标签的名称即可。
[2]select()方法
该方法会根据条件筛选对应的内容,并且以列表的形式返回,列表中的每一个元素的类型都为bs4.element.Tag类[注:哪怕筛选出的元素只有一个,也会将该元素以列表的形式返回!!!]
- html="""
- <div class="FishC" id="FishC">这是一个div标签</div>
- <a class="MadJoker" id="FishC">这是一个a1标签</a>
- <a class="Python" id="MadJoker">这里是一个a2标签</a>
- <p class="FishC" id="MadJoker">这里是一个p1标签</p>
- <p class="Python" id="MadJoker">这里是一个p2标签</p>
- """
复制代码
问题一:如果我想在下面的HTML代码中分别选中其中的div标签,类名为FishC的标签,id为MadJoker的标签,那么我该怎么做呢?
问题一代码:
- from bs4 import BeautifulSoup as bs
- soup = bs(html,'lxml')
- div = soup.select('div')
- p1 = soup.select('.FishC')
- p2 = soup.select('#MadJoker')
- print(div)
- print(type(div))
- print(type(div[0]))
- print('------------------------------------------')
- print(p1)
- print('------------------------------------------')
- print(p2)
复制代码
[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标签。
问题二代码(利用交集选择器):
- from bs4 import BeautifulSoup as bs
- soup = bs(html,'lxml')
- p = soup.select('p.Python#MadJoker')
- print(p)
复制代码
问题二代码(直接选择):
- from bs4 import BeautifulSoup as bs
- soup = bs(html,'lxml')
- p = soup.select('p')[1]
- print(p)
复制代码
[4]并集选择器
通过选择器分组可以同时选中多个选择器对应的元素
语法:select(选择器1,选择器2,选择器N)
问题三:依然是刚才的HTML代码,假如这次我想选择出所有的div标签以及所有的a标签,那么我该怎么做?答案显而易见,肯定是我们的并集选择器啦!
问题三代码:
- from bs4 import BeautifulSoup as bs
- soup = bs(html,'lxml')
- all = soup.select('div,a')
- print(all)
复制代码
[小练习]选择如上HTML代码中id为FishC的a标签以及类名为FishC的p标签[提示:交集选择器和并集选择器一起用]
小练习答案代码:- from bs4 import BeautifulSoup as bs
- soup = bs(html,'lxml')
- practice = soup.select('a#FishC,p.FishC')
- print(practice)
复制代码
[5]子孙选择器
- html="""
- <body>
- <div id="d1">
- <span>我是div标签中的span</span>
- <p><span>我是p标签中的span</span></p>
- </div>
- <div>
- <span>我是body中的span元素</span>
- </div>
- </body>
- """
复制代码
这里需要简单说明一下,什么是子,什么是孙?在HTML中除了自结束标签,其他所有的标签的组成都是<XXX>内容</XXX>,在这个XXX标签的内容中,嵌套的所有标签,我们都称其为XXX标签的后代,其中直接被嵌套的为'子',在'子'中又嵌套的标签则为'孙',如上所示的代码中body标签中直接嵌套了两个div子标签,而在这两个div标签中有分别嵌套了p标签和span标签,这些又嵌套在子标签div中的标签,我们就称之为'孙'
(1)后代元素选择器
作用:筛选出所有符合筛选条件的后代标签(包含孙级)
语法:selec(选择器1 选择器2 选择器N)
问题四:我该如何选择id为d1的div标签中的span标签呢?
问题四代码:
- from bs4 import BeautifulSoup as bs
- soup = bs(html,'lxml')
- all_span = soup.select('#d1 span')
- print(all_span)
复制代码
(2)子元素选择器
作用:筛选出所有符合筛选条件的'子标签'
语法:selec(选择器1>选择器2>选择器N)
问题五:在(1)中我们已经筛选出了在id为d1的div标签内部的所有后代标签,但是现在我们只想选择<span>我是div标签中的span</span>这条标签该怎么办呢?通过观察,我们可以发现该标签有一个特点:该标签为是id为d1的div标签的子标签,而另一条是'孙'级标签,所以,解决办法自然不言而喻
问题五代码:
- from bs4 import BeautifulSoup as bs
- soup = bs(html,'lxml')
- son_span = soup.select('#d1>span')
- print(son_span)
复制代码
[6]select_one()方法
该方法与前面的select_one方法区别并不大,前面所讲解的选择器的使用在这里依然适用,不同之处在于select_one只会返回符合选择条件的第一个元素,其类型为bs4.element.Tag类,由于差别不大,所以下面只举一个简单的小例子,大家体会一下就行了,不再一一赘述,依然是最上面的HTML代码!!!
示例代码:
- from bs4 import BeautifulSoup as bs
- soup = bs(html,'lxml')
- all_a = soup.select('a')
- print(all_a)
- print('--------------------------------------')
- first_a = soup.select_one('a')
- print(first_a)
- print(type(first_a))
复制代码
|
|