python(BS4模块)

您所在的位置:网站首页 pythonbs4库详解 python(BS4模块)

python(BS4模块)

2024-07-13 06:11:25| 来源: 网络整理| 查看: 265

BS4简介 1.什么时BS4?

BS4全称是Beatiful Soup,它提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为tiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。你不需要考虑编码方式,除非文档没有指定一个编一下原始编码方式就可以了。

2.BS4的4中对象 Tag对象:是html中的一个标签,用BeautifulSoup就能解析出来Tag的具体内容,具体的格式为‘soup.name‘,其中name是html下的标签。BeautifulSoup对象:整个html文本对象,可当作Tag对象NavigableString对象:标签内的文本对象Comment对象:是一个特殊的NavigableString对象,如果html标签内存在注释,那么它可以过滤掉注释符号保留注释文本最常用的还是BeautifulSoup对象和Tag对象 from bs4 import BeautifulSoup import re html=""" story12345

The Dormouse's story

Once upon a time there were three little sisters; and their names were westos, Lacie and Tillie; and they lived at the bottom of a well.

...

story

""" soup=BeautifulSoup(html,'html.parser') # 自动补齐html文本中成对的标签 print(soup.prettify()) 1. 根据标签获取内容; 注意:

它只能获取第一个标签里面的内容

标签的常用属性 # 根据格式化, 如果title只有一个, 根据标签可以获取 print(soup.title) print(type(soup.title)) print(soup.title.name) # 标签的名称

在这里插入图片描述

# 获取标签里面的属性信息 # attrs:返回的是字典 print(soup.a.attrs) print(soup.a.attrs['href'])

在这里插入图片描述

标签常用的方法;

get方法用于得到标签下的属性值,注意这是一个重要的方法,在许多场合都能用到,比如你要得到< img src=”#”>标签下的图像url,那么就可以用soup.img.get(‘src’)

print(soup.a.get('href')) print(soup.a.get('class')) # string得到标签下的文本内容,只有在此标签下没有子标签,或者只有一个子标签的情况下才能返回其中的内容,否则返回的是None; # get_text()可以获得一个标签中的所有文本内容,包括子孙节点的内容,这是最常用的方法 print(soup.a.string) # 标签里面的内容 print(soup.a.get_text())

在这里插入图片描述

对获取的属性信息进行修改 # 修改前的a标签内的href链接 print(soup.a.get('href')) soup.a['href']='www.baidu.com' # 修改后的a标签内的href链接 print(soup.a.get('href'))

在这里插入图片描述

2. 面向对象的匹配 # 查找符合条件的所有标签; aTagObj = soup.find_all('a') print(aTagObj) for item in aTagObj: print(item) # 需求: 获取所有的a标签, 并且类名为"sister" aTagObj = soup.find_all('a', class_="sister") print(aTagObj)

在这里插入图片描述

3. 根据内容进行匹配 # 找到标签内的文本为story的文本内容 print(soup.find_all(text='story')) # 找到标签内的文本含有story的文本内容 print(soup.find_all(text=re.compile(r'.*?story.*?')))

在这里插入图片描述

案例_爬取个人博客_去掉广告与导航栏 import requests from bs4 import BeautifulSoup def get_content(url): try: user_agent ='Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0' response = requests.get(url, headers={'User-Agent': user_agent}) response.raise_for_status() # 如果返回的状态码不是200, 则抛出异常; response.encoding = response.apparent_encoding # 判断网页的编码格式, 便于respons.text知道如何解码; except Exception as e: print("爬取错误") else: print(response.url) print("爬取成功!") return response.content def parser_content(htmlContent): # 实例化soup对象, 便于处理; soup = BeautifulSoup(htmlContent, 'html.parser') # 提取页面的头部信息, 解决乱码问题 headObj = soup.head # 提取需要的内容; divObj = soup.find_all('div', class_="blog-content-box")[0] with open('doc/csdn.html', 'w') as f: # 写入头部信息(指定编码格式和标题) f.write(str(headObj)) # 写入博客正文; f.write(str(divObj)) print("下载成功......") if __name__ == '__main__': url = "https://blog.csdn.net/qq_43194257/article/details/87361164" content = get_content(url) parser_content(content)

在这里插入图片描述

个人博客整理 import requests from bs4 import BeautifulSoup import re def get_content(url,): try: user_agent = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.109 Safari/537.36" response = requests.get(url, headers={'User-Agent': user_agent}) response.raise_for_status() # 如果返回的状态码不是200, 则抛出异常; response.encoding = response.apparent_encoding # 判断网页的编码格式, 便于respons.text知道如何解码; except Exception as e: print("爬取错误") else: print(response.url) print("爬取成功!") return response.content def parser_content(htmlContent): # 实例化soup对象, 便于处理; soup = BeautifulSoup(htmlContent, 'html.parser') # 1). 获取每个博客的大盒子: 特征: div标签, class名称一致article-item-box csdn-tracking-statistics # divObjs = soup.find_all('div', class_="article-item-box") # 2). 依次遍历每一个div标签, 获取博客标题 # 博客标题的特征: h4里面的a标签里面的内容 # 去掉默认的广告, 留下个人的博客内容; for divObj in divObjs[1:]: # **2-1. 获取博客标题: 去掉原创或者转载的信息, 只需要博客名称; title = divObj.h4.a.get_text().split()[1] # **2-2. 获取博客链接, 也就是获取a链接中href对应的值; blogUrl = divObj.h4.a.get('href') global bloginfo # 将爬取的所有内容保存到变量中[(blogtitle, blogurl)] bloginfo.append((title, blogUrl)) if __name__ == '__main__': blogPage = 3 # 全局变量, 用于保存所有博客信息; bloginfo = [] for page in range(1, blogPage+1): url = "https://blog.csdn.net/King15229085063/article/list/%s" %(page) content = get_content(url) parser_content(content) print("第%d页整理结束...." %(page)) with open('doc/myblog.md', 'a') as f: for index, info in enumerate(bloginfo[::-1]): # 在md格式中,[name](href)表示的是html中的a链接 f.write('- 第%d篇博客: [%s](%s)\n' %(index+1, info[0], info[1])) print("完成.....")

在这里插入图片描述

代理IP爬取 在使用python程序爬取网页时,有些网站会因某个ip的频繁访问而封掉该ip。为了在爬取的过程中自己本机的ip不被网站封掉,可以通过代理ip来访问。代理ip获取的途径:https://www.xicidaili.com/ from urllib.error import HTTPError import bs4 import requests from bs4 import BeautifulSoup def get_content(url): try: user_agent='Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0' response=requests.get(url,headers={'User-Agent':user_agent}) response.raise_for_status() response_encoding=response.apparent_encoding except HTTPError as e: print('爬取失败') else: print(response.url) print('爬取成功') return response.content def crawl_ip(content): soup=BeautifulSoup(content,'html.parser') for item in soup.find_all('tr')[1:]: ip = item.find_all('td')[1].string port = item.find_all('td')[2].string print((ip, port)) if __name__ == '__main__': url='https://www.xicidaili.com/nn/' content=get_content(url) crawl_ip(content)

在这里插入图片描述

爬取豆瓣TOP250个电影信息 要求: url = “http://movie.douban.com/top250/”需要获取的信息: 电影名称, 电影评分, 评价人数, 电影短评 import re import requests from bs4 import BeautifulSoup def get_content(url,): try: user_agent = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.109 Safari/537.36" response = requests.get(url, headers={'User-Agent': user_agent}) response.raise_for_status() # 如果返回的状态码不是200, 则抛出异常; response.encoding = response.apparent_encoding # 判断网页的编码格式, 便于respons.text知道如何解码; except Exception as e: print("爬取错误") else: print(response.url) print("爬取成功!") return response.content def parser_content(htmlContent): # 实例化soup对象, 便于处理; soup = BeautifulSoup(htmlContent, 'html.parser') # 1). 电影信息存储在ol标签里面的li标签: # olObj = soup.find_all('ol', class_='grid_view')[0] # 2). 获取每个电影的详细信息, 存储在li标签; details = olObj.find_all('li') for detail in details: # # 3). 获取电影名称; movieName = detail.find('span', class_='title').get_text() # 4). 电影评分: movieScore = detail.find('span', class_='rating_num').get_text() # 5). 评价人数*************** # 必须要转换类型为字符串 movieCommentNum = str(detail.find(text=re.compile('\d+人评价'))) # 6). 电影短评 movieCommentObj = detail.find('span', class_='inq') if movieCommentObj: movieComment = movieCommentObj.get_text() else: movieComment = "无短评" movieInfo.append((movieName, movieScore, movieCommentNum, movieComment)) import openpyxl def create_to_excel(wbname, data, sheetname='Sheet1', ): """ 将制定的信息保存到新建的excel表格中; :param wbname: :param data: 往excel中存储的数据; :param sheetname: :return: """ print("正在创建excel表格%s......" % (wbname)) # wb = openpyxl.load_workbook(wbname) # 如果文件不存在, 自己实例化一个WorkBook的对象; wb = openpyxl.Workbook() # 获取当前活动工作表的对象 sheet = wb.active # 修改工作表的名称 sheet.title = sheetname # 将数据data写入excel表格中; print("正在写入数据........") for row, item in enumerate(data): # data发现有4行数据, item里面有三列数据; print(item) for column, cellValue in enumerate(item): # cell = sheet.cell(row=row + 1, column=column + 1, value=cellValue) cell = sheet.cell(row=row+1, column=column + 1) cell.value = cellValue wb.save(wbname) print("保存工作薄%s成功......." % (wbname)) if __name__ == '__main__': doubanTopPage = 2 perPage = 25 # [(), (), ()] movieInfo = [] # 1, 2, 3 ,4, 5 for page in range(1, doubanTopPage+1): # start的值= (当前页-1)*每页显示的数量(25) url = "https://movie.douban.com/top250?start=%s" %((page-1)*perPage) content = get_content(url) parser_content(content) create_to_excel('/tmp/hello.xlsx', movieInfo, sheetname="豆瓣电影信息")

在这里插入图片描述

BS4模块的补充 soup = BeautifulSoup(html, 'html.parser') # 需要安装第三方模块lxml; # soup = BeautifulSoup(html, 'lxml') # 1. 返回符合条件的第一个标签内容 print(soup.title) print(soup.p) print(soup.find('p', class_=re.compile(r'^ti.*?'))) # 2. 返回符合条件的所有标签内容 print(soup.find_all('p')) print(soup.find_all('p', class_='title', text=re.compile(r'.*?story.*?'))) # 3. 获取符合条件的p标签或者a标签 print(soup.find(['title', 'a'])) print(soup.find_all(['title', 'a'])) print(soup.find_all(['title', 'a'], class_=['title', 'sister'])) # 4. CSS匹配 # 标签选择器 print(soup.select("title")) # 类选择器(.类名) print(soup.select(".sister")) # id选择器(#id名称) print(soup.select("#link1")) # 此处不支持正则表达式; # print(soup.select(re.compile("#link\d+"))) # 属性选择器() print(soup.select("input[type='password']"))

在这里插入图片描述

BS4模块的解析器 Python标准库 BeautifulSoup(markup, “html.parser”) Python的内置标准库 执行速度适中 文档容错能力强 Python 2.7.3 or 3.2.2)前 的版本中文档容错能力差lxml HTML 解析器 BeautifulSoup(markup, “lxml”) 速度快 文档容错能力强 需要安装C语言库lxml XML 解析器 BeautifulSoup(markup, [“lxml-xml”]) BeautifulSoup(markup, “xml”) 速度快 唯一支持XML的解析器 需要安装C语言库html5lib BeautifulSoup(markup, “html5lib”) 最好的容错性 以浏览器的方式解析文档 生成HTML5格式的文档 速度慢 不依赖外部扩展


【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭