python 爬虫之find、find_all用法

非 Y 不嫁゛ 提交于 2019-11-27 08:53:34

BeautifulSoup 文档里,find、find_all两者的定义如下:

find_all(tag, attributes, recursive, text, limit, keywords)

find_all(标签、属性、递归、文本、限制、关键词)

find(tag, attributes, recursive, text, keywords)

find与find_all的区别,find只会取符合要求的第一个元素,find_all会根据范围限制参数limit限定的范围取元素(默认不设置代表取所有符合要求的元素,find 等价于 find_all的 limit =1 时的情形),接下来将对每个参数一一介绍。

另外,find_all会将所有满足条件的值取出,组成一个list

一、标签tag

标签参数 tag 可以传一个标签的名称或多个标签名称组成的set做标签参数。例如,下面的代码将返回一个包含 HTML 文档中所有标题标签的列表: find_all({"h1","h2","h3"})

下面以中原网页面举例,如下图,现在要将页面上的所有标题取出,观察html可以发现,标题对应的tag 是h4,则soup.find_all('h4')

from bs4 import BeautifulSoup
import requests

url = 'https://gz.centanet.com/ershoufang/'
urlhtml=requests.get(url)
urlhtml.encoding='utf-8'
soup=BeautifulSoup(urlhtml.text,'lxml')

alink = soup.find_all('h4')
print(alink)

上面例子只是一个标签的情况,如果多个标签写法相同,只是注意要将所有的标签写在一个set里面

二、属性attributes

属性参数 attributes 是用字典封装一个标签的若干属性和对应的属性值。如,下面这个函数会返回 HTML 文档里"house-name", "house-txt"两种的 p 标签。find_all("p", {"class":{"house-name", "house-txt"}})

如下图,现在要获取红色框选中的三行信息,通过观察可知,三行信息属性"house-name", "house-txt",标签为p,则

alink = soup.find_all("p", {"class":{"house-name", "house-txt"}})
print(alink)

 

三、递归recursive

递归参数 recursive 是一个布尔变量。你想抓取 HTML 文档标签结构里多少层的信息?如recursive 设置为 True, find_all 就会根据你的要求去查找标签参数的所有子标签,以及标签的子标签。如果 recursive 设置为 False, find_all 就只查找文档的一级标签。 find_all默认是支持递归查找的(recursive 默认值是 True);一般情况下这个参数不需要设置,非你真正了解自己需要哪些信息,而且抓取速度非常重要,那时你可以设置递归参数。

这个太少用了(反正我自己就没用过,不举例了)

四、文本text

文本参数 text 有点不同,它是用标签的文本内容去匹配,而不是用标签的属性。

直接举例吧,在这个网页中,我们要查找一下,户型为“2室1厅”的有多少个,则

alink = soup.find_all(text='2室1厅')
print(alink)

需要特别注意一点,这里查找是用的是完全匹配原则,意思是如果这里你用了find_all(text='2室'),得到的结果会是0个

五、关键词keywords

关键词参数 keyword,自己选择那些具有指定属性的标签

同样是上面网页的内容,现在要取id='one2'的内容,则

from bs4 import BeautifulSoup
import requests

url = 'http://zfcj.gz.gov.cn/data/laho/projectdetail.aspx?changeproInfoTag=1&changeSellFormtag=1&pjID=47140&name=fdcxmxx'
urlhtml=requests.get(url)
urlhtml.encoding='utf-8'
soup=BeautifulSoup(urlhtml.text,'lxml')

alink = soup.find_all(id="one2")
print(alink)

注意:如果是class、id等参数,用keywords 或者attributes用法一样,如果是一些其他参数,则用keywords

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!