前端盲一枚 近期对爬虫产生了兴趣 嘿嘿 学习这份美丽的汤 并做个笔记

前言

  • 官方文档

  • 官方宣布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
  1. 打开命令行
  2. 输入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中,节点的属性中,字符串中或他们的混合中.

常用的过滤器

  1. 字符串
  2. 正则表达式
  3. 列表
  4. 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相关推荐

  1. python beautifulsoup模拟点击_Python爬虫丨BeautifulSoup实践

    项目分析 爬取的网站是下厨房,目标是固定栏目[本周最受欢迎] 可以看到我们要爬取的/explore/不在禁止爬取的列表内 1.先看下页面 计划拿到的信息是:菜名.所需材料.和菜名所对应的详情页URL ...

  2. python html解析查找字符串_用python的BeautifulSoup分析html

    序言 之前用python爬取网页的时候,一直用的是regex或者自带的库sgmllib里的SGMLParser.但是遇到复杂一点的情况时,SGMLParser往往就不那么给力了!(哈,难道说我 too ...

  3. Windows下Python 3.6 安装BeautifulSoup库

    " 介绍Python库BeautifulSoup安装." 01 - BeautifulSoup库介绍 Beautiful Soup是Python的一个库,支持Python 2和Py ...

  4. beautifulsoup以及正则表达式re之间的一些知识!

    代码: import requests import re from bs4 import BeautifulSoup r = requests.get("https://python123 ...

  5. beautifulsoup里面的find()和findall()小代码测试

    区别: 大白话说,就是find()可以应对于单个.然而find_all()却要一次查找好多! 代码: import requests from bs4 import BeautifulSoup r = ...

  6. beautifulsoup关于标签的初学习

    代码: import requests from bs4 import BeautifulSoup r = requests.get("https://python123.io/ws/dem ...

  7. BeautifulSoup的初使用!

    简单使用: python小例子链接: https://python123.io/ws/demo.html 代码: import requests from bs4 import BeautifulSo ...

  8. python功能性爬虫案例_Python使用requests及BeautifulSoup构建爬虫实例代码

    本文研究的主要是Python使用requests及BeautifulSoup构建一个网络爬虫,具体步骤如下. 功能说明 在Python下面可使用requests模块请求某个url获取响应的html文件 ...

  9. 爬虫书籍-Python网络爬虫权威指南OCR库 NLTK 数据清洗 BeautifulSoup Lambda表达式 Scrapy 马尔可夫模型

    Python网络爬虫权威指南 编辑推荐 适读人群 :需要抓取Web 数据的相关软件开发人员和研究人员 作为一种采集和理解网络上海量信息的方式,网页抓取技术变得越来越重要.而编写简单的自动化程序(网络爬 ...

  10. from beautifulsoup4 import BeautifulSoup 报错

    >>> from beautifulsoup4 import BeautifulSoup Traceback (most recent call last):   File &quo ...

最新文章

  1. 报名 | 《大数据科学与应用系列讲座》全新上线!
  2. 关于卡巴斯基部分激活问题的解决方案
  3. 新手学JAVA(六)----处理随机性的数据
  4. python会内存泄漏吗_Python内存泄漏和内存溢出的解决方法
  5. Qt文档阅读笔记-stackUnder官方解析与实例
  6. 用移动智能设备访问Ossim系统
  7. js和ajax点赞功能代码_FANUC数控机床:你会用“M代码”调用“系统程式”吗
  8. 实战系列-HashMap深入剖析
  9. sharepoint搜索pdf文档
  10. vim---C++开发环境搭建
  11. opencv函数之saturate_cast(防止溢出)
  12. chrome浏览器加载图片失败问题
  13. InsightFace-Paddle实现人脸比对
  14. Docker镜像创建的三种方式详解——dockerfile制作apache镜像
  15. UBUNTU上打字练习软件
  16. 移远 EC200S 模组(4G Cat.1 通信模组)AT指令测试 TCP/UDP 通信过程
  17. 在deepin运行imageapp程序
  18. 合成大西瓜unity总结
  19. IE 10 SCRIPT5022: InvalidCharacterError错误解决办法
  20. 影响新零售商城系统直播带货的四大因素

热门文章

  1. OCR识别+人脸识别
  2. Android学习日记 Notification 通知
  3. SaaSBase:英诺森ProcessGo是什么?
  4. Lucene5学习之拼音搜索
  5. 制作3D 游戏涉及的工具
  6. Linux中光驱设备如何使用,如何在Linux操作系统下使用虚拟光驱
  7. 使用WINHEX对回收站清除的文件进行恢复
  8. jeecg-boot:Form表单
  9. 2021-08-08 rabbit安装后无法启动的问题
  10. 一个游戏数值策划的自白:我所理解的数值工作