爬虫一-----beautifulsoup
规范的书写爬虫是十分重要的,如果某个位置出了问题就跨过去,继续执行。否则,你洗洗睡了,期待爬虫在这一页替你爬取所有信息,但是它却报错退出来了。
from urllib.request import urlopenfrom urllib.error import HTTPErrorfrom bs4 import BeautifulSoupdef GetTitle(url): try: html=urlopen(url) except HTTPError as e: return None try: bsobj=BeautifulSoup(html,"html.parser")#这里要选择解释器 title=bsobj.body.h1 except AttributeError as e: return None return titletitle=GetTitle("https://hao.lenovo.com.cn/?c=lenovo_oem")if(title==None): print("未找到")else: print(title)
Beatifulsoup中的find()和findall()
.findAll(tag, attributes, recursive, text, limit, keywords) .find(tag, attributes, recursive, text, keywords)
tag标签:可以传一个标签的名称或多个标签名称组成的Python列表做标签参数。
例如,下面的代码将返回一个包含HTML文档中所有标题标签的列表:1.findAll({"h1","h2","h3","h4","h5","h6"}
attributes属性:用一个字典封装一个标签的若干属性和对应的属性值。例如,下面这个函数会返回HTML文档里红色与绿色两种颜色的span标签:
.findAll("span", {"class":{"green", "red"}
recursive 递归 一般情况下默认为True,可以手动赋False。
如果recursive设置为True,findAll就会根据你的要求去查找标签参数的所有子标签,以及子标签的子标签。如果recursive设置为False,findAll就只查找文档的一级标签
text 文本,根据文本内容进行匹配
nameList = bsObj.findAll(text="the prince")
limit,显然只用于findAll方法。find其实等价于findAll的limit等于1时的情形。如果你只对网页中获取的前x项结果感兴趣,就可以设置它。但是要注意,这个参数设置之后,获得的前几项结果是按照网页上的顺序排序的,未必是你想要的那前几项
keyword 使用指定属性来筛选
关键词参数的注意事项:
虽然关键词参数keyword在一些场景中很有用,但是,它是BeautifulSoup在技术上做的一个冗余功能。任何用关键词参数能够完成的任务,同样可以用本章后面将介绍的技术解决(请参见2.3节和2.6节)。例如,下面两行代码是完全一样的:
bsObj.findAll(id="text") bsObj.findAll("", {"id":"text"})
另外,用keyword偶尔会出现问题,尤其是在用class属性查找标签的时候,因为class是Python中受保护的关键字。也就是说,class是Python语言的保留字,在Python程序里是不能当作变量或参数名使用的(和前面介绍的BeautifulSoup.findAll()里的keyword无关)
2。假如你运行下面的代码,Python就会因为你误用class保留字而产生一个语法错误:
bsObj.findAll(class="green")
不过,你可以用BeautifulSoup提供的有点儿臃肿的方案,在class后面增加一个下划线:
bsObj.findAll(class_="green")
另外,你也可以用属性参数把class用引号包起来:
bsObj.findAll("", {"class":"green"})
看到这里,你可能会扪心自问:“现在我是不是已经知道如何用标签属性获取一组标签了——用字典把属性传到函数里就行了?”
回忆一下前面的内容,通过标签参数tag把标签列表传到.findAll()里获取一列标签,其实就是一个“或”关系的过滤器(即选择所有带标签1或标签2或标签3…的一列标签)。如果你的标签列表很长,就需要花很长时间才能写完。而关键词参数keyword可以让你增加一个“与”关系的过滤器来简化工作。