最近在学习爬虫的时候,发现之前学的总是会忘记,虽然在网上保存了查询的资料的书签,但是感觉还是不够直观,总还是需要再在网上查询,所以,现在打算在CSND上写一下平时的一些笔记,很多应该会从查到的资料粘贴过来,无其他用途,仅仅自己做笔记而已。
- bs4的select查找
类名前加点,id名前加 #,在这里我们也可以利用类似的方法来筛选元素,用到的方法是 soup.select(),返回类型是 list
(1)通过标签名查找
print soup.select('title')
#[<title>The Dormouse's story</title>]
(2)组合查找
组合查找即和写 class 文件时,标签名与类名、id名进行的组合原理是一样的,例如查找 p 标签中,id 等于 link1的内容,二者需要用空格分开
print soup.select('p #link1')
#[<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>]
直接子标签查找
print soup.select("head > title")
#[<title>The Dormouse's story</title>]
(5)属性查找
查找时还可以加入属性元素,属性需要用中括号括起来,注意属性和标签属于同一节点,所以中间不能加空格,否则会无法匹配到。
print soup.select("head > title")
#[<title>The Dormouse's story</title>]
print soup.select('a[href="http://example.com/elsie"]')
#[<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>]
同样,属性仍然可以与上述查找方式组合,不在同一节点的空格隔开,同一节点的不加空格
print soup.select('p a[href="http://example.com/elsie"]')
#[<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>]
- bs4 find_all查找
findAll(tag,attributes,recursive,text,limit,keywords)
tag:索要筛选的标签
attributes:标签的特征值,是用Python字典封装的一个标签的若干属性和对应的属性值
recursive:布尔型变量,是否递归,默认为True
text:文本参数,用标签的文本内容去匹配
#找到所有的含有the prince的标签
namelist=bsObj.findAll(text="the prince")
print(len(namelist))
limit:范围限制参数,find函数即为limit参数值为1,限制寻找次数
keywords:选择具有指定属性的标签
alltext=bsObj.findAll(id="text")
print(alltext[0].get_text())
注意:keywords参数是个冗余的参数,其可以被attributes等价代替
如下面两段代码是完全一样的
bsObj.findAll(id="text")
bsObj.findAll("",{ "id":"text"})
另外提一点,不一定要一次性查找完全,可以先把其中的小部分提取出来,再从这小部分里面再提取自己想要的内容
- 如何用bs4拿到标签里面的文字
值得注意的是,无论使用select还是find_all,返回的都是一个列表,所以当我们想要拿出其中的字符串的时候,别忘了加上索引,然后可以用.string方法拿到字符串
dls[0].select('strong')[0].string