上篇中我们已经可以简单的下载网页中的图片到本地了,这里做一个补充:
soup.find和soup.find_all中的参数是一样的。不相信可以在pycharm中,按住ctrl单击我们的soup.find函数,然后我们会看到这样一个定义:
def find(self, name=None, attrs={}, recursive=True, text=None,
**kwargs):
"""Return only the first child of this Tag matching the given
criteria."""
r = None
l = self.find_all(name, attrs, recursive, text, 1, **kwargs)
if l:
r = l[0]
return r
其实内部调用的就是find_all,然后取的是第一个元素。
另对于<div class='content'></div>此类型的标签元素,我们不能使用soup.find('div', class='content'),因为class是定义一个类的关键字,而此关键字是不能作为参数的。
如:中国研招网
我们需要在页面中找到对应的<ul class='news-list'></ul>
import requests
from bs4 import BeautifulSoup
response = requests.get(url = "https://yz.chsi.com.cn/kyzx/tjxx/")
page = response.text
soup = BeautifulSoup(page, 'html.parser')
ul = soup.find('ul','news-list')
print(ul)
运行截图:
注释:Python函数参数的五种类型
ul = soup.find('ul','news-list')的等价写法:
ul = soup.find(name='ul', attrs={"class":'news-list'})
Python的参数类型一共有5种:POSITIONAL_OR_KEYWORD、VAR_POSITIONAL(位置参数)、VAR_KEYWORD(关键字参数)、KEYWORD_ONLY、POSITIONAL_ONLY
其中 POSITIONAL_OR_KEYWORD、VAR_POSITIONAL、VAR_KEYWORD、KEYWORD_ONLY 比较常用
1、可变长位置参数,接收一个元组:参数类型为VAR_POSITIONAL时,即*args参数,只能通过位置传值,如
#位置参数
def aaa(*args):
print("参数是:{0}".format(args))
aaa("weizu", "tiantian")
aaa(args="wang")#这种写法就是错误的
因为只是代表位置而不是说这个位置有为args的名字,运行截图:
def aaa(*args, name):
print("参数是:{0}".format(args))
aaa("weizu", "tiantian")#这种写法也是错误的
错误的原因其实类似,因为aaa方法,首个是位置参数,而代表了一个位置,所以在调用的时候,默认所有的不带指定(即关键字)的传参方式都是在这个位置之内,所以也是错误的,运行截图:
正确的调用方式是:
aaa("weizu", name = "tiantian")
2、可变长关键字参数,接收一个字典:参数类型为VAR_KEYWORD,即 **kwargs参数,只能通过关键字传值,如
def aaa(**kwargs):
print("参数是:{0}".format(kwargs))
aaa("weizu")#错误的写法
运行截图:
正确的书写方式是:字典,使用的时候传入键值对
def aaa(**kwargs):
print("参数是:{0}".format(kwargs))
aaa(name = "weizu", wo = 'wang')
截图:
不难发现关键字参数无论是几个参数,传入的形式是以字典的方式传入。而且,关键字参数要放在最后面。
3、位置或关键字参数,参数的类型为POSITIONAL_OR_KEYWORD时,说明此参数前面没有VAR_POSITIONAL类型的参数,可以通过位置或关键字传值,如
def aaa(name):
print("参数是:{0}".format(name))
aaa(name = "weizu")
#或者
aaa("hello")
截图:
这种参数也是最常用的参数。
4、关键字参数,参数类型为KEYWORD_ONLY时,说明此参数前面存在VAR_POSITIONAL类型的参数,只能通过关键字传值,如
其实前面介绍过:
def aaa(*args, name):
print("参数是:{0}".format(name))
aaa("haohao",name = "weizu") #这里只能使用关键字name
5、默认参数
def aaa(*args, name='weizu'):
print("参数是:{0}".format(name))
aaa("haohao")
也即是使用name='value',定义个一初始值,在不传入的时候,值就是默认的设置。
使用:
def fun(a, b, c=0, *args, **kw):
print(a, b, c, args, kw)
fun("12", "wizu", 3, "alfjalfj","weizu")
fun("12", "wizu", 3, "alfjalfj","weizu", bb = 'test')
运行截图:
因为我们不指定bb='test'的键值对形式,那么编译器会默认解析成前面变长位置参数,即一个元组。
使用的时候,也通常遵循:位置或关键字参数、默认参数、可变长位置参数、可变长关键字参数的顺序使用。
当然了看编译的结果自己也就可以改改就出来了。
作者:无涯明月