BeautifulSoup 使用多条件查询

发布时间 2023-08-08 20:49:48作者: 野生非著名程序员

       最近开始学习python的爬虫,开始的时候单纯的用requests.get(url)取得源代码后,用正则表达后来取得相关的数据,效率不高,接触到BeautifulSoup,发现确实方便.

       正好遇到一个问题,需要取的数据在两个div中,是两个class名,最开始的时候是取得两次来得到数据,就想精简一下,弄成两个值的或的关系,发现例子比较多的是不同标签的属性可以是与的关系,在网上找了一圈没有发现自己想要的结果

仔细的看下了BeautifulSoup的文档,发现在例子里面有讲: 同时用多种CSS选择器查询元素的例子:

soup. select ( "#link1,#link2" )
# [Elsie,
#  Lacie]
但这个默认的id的这个属性,没有讲其它属性,不知道其它的属性是否也可以,于是自己试了下发现可以,以下三种写法都可以
soup. select ( "div.class_first_name,div.class_two_name" )
或
soup. select ( "div[class~=class_first_name], div[class~=class_two_name]" )
或
soup. select ( "div[class=class_first_name], div[class=class_two_name]" )
自己也走了些弯路,例子里面有#号,不知道写这些的时候是否也需要#,倒子里面写的直接是id的属性,没有写标签,也不知道带指定的标签是否可行,仔细的看文档,有讲通过CSS的类名查找
soup. select ( ".sister" )
# [Elsie,
#  Lacie,
#  Tillie]

soup. select ( "[class~=sister]" )
# [Elsie,
#  Lacie,
#  Tillie]

于是结合这几个例子,自己结合一步步的试,先试出不指定标签时获取两个class的与的关系,然后再加上指定标签的 现在新的问题是,我想取的两个值都出现在div第一次出现的时候,可以用的limit值来控制

如果值是这样的
Elsie
Elsie
Elsie
Elsie
我们可以用如下语句来获取想得到的值
soup. select ( "div[class=class_first_name], div[class=class_two_name]" , limit=2)
但如果是这样的
Elsie
Elsie
Elsie
Elsie
如上的命令则会取两个first的值 ,limit只能控制总数,不能达到每个div取第一次出现的时候的值,不知道有什么办法能改成自己想要的这种结果。