BeautifulSoup
前端盲一枚 近期对爬虫产生了兴趣 嘿嘿 学习这份美丽的汤 并做个笔记
前言
官方文档
官方宣布Beautiful Soup4之前的版本不再维护,所以不推荐去学习
Beautiful Soup 3是上一个发布版本,目前已经停止维护
只要一个小变动就能让大部分的Beautiful Soup 3代码使用Beautiful Soup 4的库和方法—-修改 BeautifulSoup 对象的引入方式
from BeautifulSoup import BeautifulSoup
修改为:
from bs4 import BeautifulSoup
如果代码抛出
ImportError
异常No module named BeautifulSoup
,原因可能是尝试执行Beautiful Soup 3
,但环境中只安装了Beautiful Soup 4
库如果代码抛出
ImportError
异常No module named bs4
,原因可能是尝试运行Beautiful Soup 4
的代码,但环境中只安装了Beautiful Soup 3
.
安装
BeautifulSoup 一个灵活又方便的网页解析库,处理高效,支持多种解析器。
你也想使用吗?那就开始安装吧!!!
- 使用
pip
安装bs4
- 打开命令行
- 输入
pip install bs4
- 可以用
pip list
查看有没有安装成功
解析器
BeautifulSoup不仅支持Python标准库中的HTML解析器,还支持一些第三方的解析器
- 我使用的是lxml
解析器 | 使用方法 |
---|---|
Python标准库 | BeautifulSoup(markup, “html.parser”) |
lxml HTML 解析器 | BeautifulSoup(markup, “lxml”) |
lxml XML 解析器 | BeautifulSoup(markup, [“lxml-xml”]) 或者 BeautifulSoup(markup, “xml”) |
html5lib | BeautifulSoup(markup, “html5lib”) |
使用lxml解析器
- 导入模块
from bs4 import BeautifulSoup soup = BeautifulSoup(xxx.html,"lxml")
节点选择器
使用<标签>选择元素
- 选择元素用法格式
soup.tag(对象.标签名)
- 返回节点元素
例子: soup.title<title> XXX </title> 类型为:tag类对象`soup.a``<a XXXX >XXX</a> `
提取信息用法
获取标签名
soup.tag.name
返回一个字符串
例子:soup.a.name 值为“a”
获取属性
soup.tag.attrs
返回一个字典
例子:soup.a.attrs{'xx':'xxx','class':['xxx'],...}
获取内容
soup.tag.string
返回一个字符串
例子: soup.a.string"xxxxx"
节点嵌套选择
获取嵌套标签中的内容
soup.tag.tag
返回节点元素,类型为:tag类对象
例子:嵌套样式`<head><title>The Docmouse's stery</title></head>`获取title`soup.head.title`获取title内容`soup.head.title.string`
节点选择器关联选择
子节点
soup.tag.contents
返回一个列表
or
soup.tag.children
返回一个可迭代对象(生成器)
例子:soup.p.contents返回一个<p>区域中的所有子标签列表,其中包含<p>本身标签内容,也就是说把<p>中的所有内容选择出来放入列表中,值得注意的是:<p>子标签的子标签不会被选择soup.p.children返回一个可迭代对象(生成器),需要使用循环获取生成器中的内容。
父节点
soup.tag.parent
返回节点元素
例子:soup.a.parent返回<a>的父节点
祖先节点
soup.tag.parents
返回一个包含所有祖父的可迭代对象(生成器)
例子:soup.a.parents返回<a>的祖先节点的迭代器,遍历迭代器将得到<a>的父节点、<a>的父节点的父节点直到迭代结束
兄弟节点
- 获取下一个兄弟节点
soup.tag.next_sibling
返回节点元素
例子:soup.a.next_sibling获取下一个节点
- 获取后面所有兄弟节点
soup.a.tag.next_siblings
返回一个包含 < a > 的所有兄弟节点的可迭代对象(生成器)
- 获取上一个兄弟节点
soup.tag.previous_sibling
返回节点元素
用法同soup.a.next_sibling
- 获取前面所有的兄弟节点
soup.tag.previous_siblings
用法同soup.a.tag.next_siblings
CSS选择器
id选择器,需要使用
#
来定位元素
soup.select("#list-1")
类选择器,需要使用
.
来定位元素
soup.select(".body")
标签选择器,需要使用标签名来定位元素
soup.select("li")
混合使用 结合实际使用
例子:可以先用类选择器>然后使用id选择器>最后使用标签soup.select(".body #list-1 li")
- 小技巧:使用父节点限制选择class的范围,达到精准定位的效果
基本使用
- 使用BeautifulSoup中的select()方法结合CSS选择器语法即可定位
soup = BeautifulSoup(xxx.html,"lxml")
soup.select()
进阶用法
- 嵌套选择
例子:获取ul下的所有<li>标签soup = BeautifulSoup(xxx.html,"lxml")for ul in soup.select("ul"):for li in ul.select("li"):
- 属性获取
例子:获取所有<li>标签中的class属性值soup = BeautifulSoup(xxx.html,"lxml")for ul in soup.select("ul"):for li in ul.select("li"):print(li.attrs['class'])
- 文本获取
例子:获取所有<li>标签中的文本soup = BeautifulSoup(xxx.html,"lxml")for ul in soup.select("ul"):for li in ul.select("li"):print(li.string)
方法选择器
方法表
方法 | 作用 |
---|---|
find_all() | 查找所有符合条件的元素 |
find_all_previous() | 往前查找所有符合条件的节点(包括子孙节点) |
find_all_next() | 往后查找所有符合条件的节点(包括子孙节点) |
find() | 查找第一个符合条件的元素 |
find_previous() | 往前查找第一个符合条件的元素 |
find_next() | 往后查找第一个符合条件的元素 |
find_parents() | 查找祖先节点 |
find_parent() | 查找父节点 |
find_next_siblings() | 往后查找所有符合条件的兄弟节点 |
find_next_sibling() | 往后查找符合条件的兄弟节点 |
find_previous_siblings() | 往前查找所有符合条件的兄弟节点 |
find_previous_sibling() | 往前查找符合条件的兄弟节点 |
过滤器
过滤器可以被用在tag的name中,节点的属性中,字符串中或他们的混合中.
常用的过滤器
- 字符串
- 正则表达式
- 列表
- CSS选择器
原型
find_all( name , attrs , recursive , string ,limit, **kwargs )
返回值是一个列表
find( name , attrs , recursive , string , **kwargs )
找不到目标时返回None
name 参数
name 参数可以查找所有名字为 name 的tag,字符串对象会被自动忽略掉.
例子:soup.find_all("title")[<title>The Dormouse's story</title>]
- attrs参数
以字典类型传入
soup.find_all(attrs={'id':'link'})
- kwargs参数
soup.find_all(id='link')
soup.find_all(class_='element')
需要注意的是在Python中class是关键字,所以在匹配时必须在后面加上下划线
- text参数
soup.find_all(text='link')
- limit参数
限制返回结果
find()方法没有此参数
soup.find_all('a',limit=2)
得到的结果就是返回两个<a>标签
- recursive参数
值为布尔值,默认为True,是否获取子孙节点
soup.find_all('title',recursive=False)
- string 参数
搜文档中的字符串内容
soup.find_all(string="Elsie")
- True
可以匹配任何值,下面代码查找到所有的tag,但是不会返回字符串节点
for tag in soup.find_all(True):print(tag.name)
复制Beautiful Soup对象
- 使用
copy
中的copy()
方法可以复制Beautiful Soup对象
例子:import copyp_copy = copy.copy(soup.p)print p_copy
- 这会在把复制出来保存在新地址中
soupStrainer类
只会解析在 SoupStrainer 中定义过的文档.
导入模块
from bs4 import SoupStrainer
- 方法参数
only_tags = SoupStrainer(name,attrs,recursive,string,**kwargs)
from bs4 import SoupStraineronly_a_tags = SoupStrainer("a") #只解析a标签only_tags_with_id_link2 = SoupStrainer(id="link2")#解析标签id值为link2的的标签def is_short_string(string):return len(string) < 10only_short_strings = SoupStrainer(string=is_short_string)
常见错误
- 解析错误
TMLParser.HTMLParseError: malformed start tag
HTMLParser.HTMLParseError: bad end tag
解析异常
找不到指定的tag,而这个tag确实存在以上的解决方案
安装lxml解析器即可解决
BeautifulSoup相关推荐
- python beautifulsoup模拟点击_Python爬虫丨BeautifulSoup实践
项目分析 爬取的网站是下厨房,目标是固定栏目[本周最受欢迎] 可以看到我们要爬取的/explore/不在禁止爬取的列表内 1.先看下页面 计划拿到的信息是:菜名.所需材料.和菜名所对应的详情页URL ...
- python html解析查找字符串_用python的BeautifulSoup分析html
序言 之前用python爬取网页的时候,一直用的是regex或者自带的库sgmllib里的SGMLParser.但是遇到复杂一点的情况时,SGMLParser往往就不那么给力了!(哈,难道说我 too ...
- Windows下Python 3.6 安装BeautifulSoup库
" 介绍Python库BeautifulSoup安装." 01 - BeautifulSoup库介绍 Beautiful Soup是Python的一个库,支持Python 2和Py ...
- beautifulsoup以及正则表达式re之间的一些知识!
代码: import requests import re from bs4 import BeautifulSoup r = requests.get("https://python123 ...
- beautifulsoup里面的find()和findall()小代码测试
区别: 大白话说,就是find()可以应对于单个.然而find_all()却要一次查找好多! 代码: import requests from bs4 import BeautifulSoup r = ...
- beautifulsoup关于标签的初学习
代码: import requests from bs4 import BeautifulSoup r = requests.get("https://python123.io/ws/dem ...
- BeautifulSoup的初使用!
简单使用: python小例子链接: https://python123.io/ws/demo.html 代码: import requests from bs4 import BeautifulSo ...
- python功能性爬虫案例_Python使用requests及BeautifulSoup构建爬虫实例代码
本文研究的主要是Python使用requests及BeautifulSoup构建一个网络爬虫,具体步骤如下. 功能说明 在Python下面可使用requests模块请求某个url获取响应的html文件 ...
- 爬虫书籍-Python网络爬虫权威指南OCR库 NLTK 数据清洗 BeautifulSoup Lambda表达式 Scrapy 马尔可夫模型
Python网络爬虫权威指南 编辑推荐 适读人群 :需要抓取Web 数据的相关软件开发人员和研究人员 作为一种采集和理解网络上海量信息的方式,网页抓取技术变得越来越重要.而编写简单的自动化程序(网络爬 ...
- from beautifulsoup4 import BeautifulSoup 报错
>>> from beautifulsoup4 import BeautifulSoup Traceback (most recent call last): File &quo ...
最新文章
- 报名 | 《大数据科学与应用系列讲座》全新上线!
- 关于卡巴斯基部分激活问题的解决方案
- 新手学JAVA(六)----处理随机性的数据
- python会内存泄漏吗_Python内存泄漏和内存溢出的解决方法
- Qt文档阅读笔记-stackUnder官方解析与实例
- 用移动智能设备访问Ossim系统
- js和ajax点赞功能代码_FANUC数控机床:你会用“M代码”调用“系统程式”吗
- 实战系列-HashMap深入剖析
- sharepoint搜索pdf文档
- vim---C++开发环境搭建
- opencv函数之saturate_cast(防止溢出)
- chrome浏览器加载图片失败问题
- InsightFace-Paddle实现人脸比对
- Docker镜像创建的三种方式详解——dockerfile制作apache镜像
- UBUNTU上打字练习软件
- 移远 EC200S 模组(4G Cat.1 通信模组)AT指令测试 TCP/UDP 通信过程
- 在deepin运行imageapp程序
- 合成大西瓜unity总结
- IE 10 SCRIPT5022: InvalidCharacterError错误解决办法
- 影响新零售商城系统直播带货的四大因素