当前位置: 首页 > 后端技术 > Python

11-BeautifulSoup

时间:2023-03-26 01:04:26 Python

CSSSelectorpython爬虫的CSS(CascadingStylesheet),用于定位(locate)页面上的元素(Elements)的Selector。在Selenium官网的Document中,强烈推荐使用CSSlocator代替XPath来定位元素,因为CSSlocator比XPathlocator更快。BeautifulSoup支持从HTML或XML文件中提取数据的Python库,支持Python标准库中的HTML解析浏览器也支持一些第三方解析器lxml,使用XPath语法,推荐安装。BeautifulSoup自动将输入文档转换为Unicode编码,并将输出文档转换为utf-8编码。你不需要考虑编码方式,除非文档没有指定编码方式,否则BeautifulSoup无法自动识别编码方式。那么,你只需要解释一下原来的编码方式就可以了。BeautifulSoup4Installation官方文档链接:https://www.crummy.com/softwa...可以使用pip安装pipinstallbeautifulsoup4安装解析器(上一课已经安装)pipinstalllxmlBeautifulSoup支持HTML解析器在Python标准库,也支持一些第三方解析器,其中之一就是lxml。根据操作系统的不同,您可以选择以下方法安装lxml:另一个可选的解析器是用纯Python实现的html5lib。html5lib的解析方式和浏览器一样。可以选择以下方法安装html5lib:pipinstallhtml5lib下表列出了主要的解析器:Parser使用优点缺点Python标准库BeautifulSoup(markup,"html.parser")Python内置的标准库;适中的执行速度;强大的文档容错能力。Python2.7.3或3.2.2版本之前文档容错性差lxmlHTML解析器BeautifulSoup(markup,"lxml")速度快;强大的文档容错能力;需要安装C语言库lxmlXML解析器BeautifulSoup(markup,["lxml-xml"])BeautifulSoup(markup,"xml")很快;唯一支持XML的解析器需要安装C语言库html5libBeautifulSoup(markup,"html5lib"),容错性最好;在浏览器中解析文档;生成HTML5格式文件速度慢;不依赖外部扩展。推荐使用lxml作为解析器,效率更高。在Python2中。Python3中7.3之前的版本和3.2.2之前的版本必须安装lxml或者html5lib,因为那些Python版本的标准库中内置的HTML解析方法不够稳定。快速入门html_doc="""睡鼠的故事T睡鼠的故事

从前有三个小姐妹;他们的名字是Elsie,Lacie和Tillie;

...

"""用BeautifulSoup解析这段代码,可以得到一个BeautifulSoup对象,并根据到标准缩进格式:frombs4importBeautifulSoupsoup=BeautifulSoup(html_doc,'lxml')让我们打印soup对象的内容print(soup)![](https://upload-images.jianshu...格式化输出soupobjectprint(soup.prettify())写CSS时的CSS选择器:标签名不加任何修饰符,类名前加点,id名前加#,使用类似的方法过滤元素,方法使用的是soup.select(),返回类型是list通过标签名查找print(soup.select('title'))#[睡鼠的故事]print(soup.select('a'))#[,Lacie,Tillie]print(soup.select('b'))#[睡鼠的故事]按班级名称搜索print(soup.select('.sister'))#[,Lacie,Tillie]按id名称搜索print(soup.select('#link1'))#[]直接子标签搜索print(soup.select("head>title"))#[睡鼠的故事]组合搜索组合搜索是labelname,classname,idname的组合原则是一样的,比如p标签中,id等于link1的内容,属性和标签不属于同一个节点,需要以空格pri分隔nt(soup.select('p#link1'))#[,Lacie,Tilliea>]print(soup.select('a[href="http://example.com/elsie"]'))#[]同样的,属性还是可以结合上面的搜索方式,同节点不空格分隔,同节点不空格print(soup.select('pa[href="http://example.com/elsie"]'))#[]上面select方法返回的结果都在列表形式,可以通过get_text()方法遍历输出,获取其内容print(soup.select('title')[0].get_text())fortitleinsoup.select('title'):print(title.get_text())TagTag是什么?通俗的说就是HTML中的一个标签,比如Elsie打印类型(soup.select('a')[0])Output:bs4.element.Tag对于Tag,它有两个重要的属性,name和attrs,我们来体验一下nameprint(soup.name)print(soup.select('a')[0].name)output:[document]'a'soup对象本身比较特殊,它的名字是[document],对于??其他内部标签,输出值就是标签本身的名字。attrsprint(soup.select('a')[0].attrs)输出:{'href':'http://example.com/elsie','class':['sister'],'id':'link1'}在这里,我们打印出soup.select('a')[0]标签的所有属性,得到的类型是一个字典。如果我们想单独获取某个属性,我们可以这样做,比如我们获取的类名是什么print(soup.select('a')[0].attrs['class'])输出:['姐姐']实战爬取豆瓣电影排行榜案例https://movie.douban.com/chartfrombs4importBeautifulSoupimporturllib.parseimporturllib.requesturl='https://movie.douban.com/chart'#豆瓣排名herders={'User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/85.0.4183.102Safari/537.36','Referer':'https://movie.douban.com/','Connection':'keep-alive'}#请求头信息req=urllib.request.Request(url,headers=herders)#设置请求头response=urllib.request.urlopen(req)#response是返回响应的数据htmlText=response.read()#读取响应数据#将字符串解析成html文档html=BeautifulSoup(htmlText,'lxml')result=html.select(".pl2")file=open('data.txt','a',encoding='utf-8')#打开文件extfile#遍历几个foriteminresult:str=''#声明一个空字符串str+=item.select('a')[0].get_text().replace('','').replace("\n","")#获取标题文本。替换空格。替换换行符str+='('#给分数添加左括号str+=item.select('.rating_nums')[0].get_text()#获取分数str+=')\n'#给分数加上右括号print(str)#在控制台输出内容file.write(str)#写入到filefile.close()#ClosethefileResultsSavemefromevil/DemonShowdown(台湾)/Pleasesavemefromevil(7.2)上帝遗忘者/恶魔每小时(6.9)监视资本主义:聪明的陷阱/社会困境/智能社会:困境(台湾)(8.6)我想结束这一切/我正在考虑结束一切(程式化标题)(7.3)监禁/被困者(4.4)鸣鸟不飞:乌云/SaezuruToriWaHabatakanai:TheCloudsGather(8.3)树上有个好地方/TheHomeintheTree(7.9)HopeFrozen2:QueenBee/SatanNanny:BloodyQueen/TheBabysitter2(5.7)FrozenHope/SnowHiddenHope:RebornintheDay/HopeFrozen:AQuestToLiveTwice(8.1)IronRain2:Summit/IronRain2:SummitTalks/IronRain2:NuclearWarCrisis(HongKong)(5.8)单词表"""单词表BeautifulSoupSoupurlUniformResourceLocatorliblibrarylibraryparserequestparseresponeresponseselectselectopentoopenencodingget_texttogettextwritewriteclose关闭问题?嗯,这是另一种类似XPath语法的搜索方式,你觉得哪种更方便呢?IT入门感谢关注|练习地址:www.520mg。com/它