一、bs4简介

即BeautifulSoup,是python种的一个库,最主要的内容就是从网页中抓取数据。

Beautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。

Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。你不需要考虑编码方式,除非文档没有指定一个编码方式,这时,Beautiful Soup就不能自动识别编码方式了。然后,你仅仅需要说明一下原始编码方式就可以了。

Beautiful Soup已成为和lxmlhtml6lib一样出色的python解释器,为用户灵活地提供不同的解析策略或强劲的速度。

二、使用方法

1.首先导入bs4库

from bs4 import BeautifulSoup

2.然后我们利用requests或者urllib2来打开一个网址(这里以https://www.baidu.com为例)

import requests
url = "https://www.baidu.com"
r1 = requests.get(url,'lxml')
r1.encoding='utf-8'
#print (r1.text)

输出结果:
python bs4
3.创造一个BeautifulSoup对象

bs_1=BeautifulSoup(r1.text,'lxml')
#print(bs_1)

两个参数:第一个参数是要解析的html文本,第二个参数是使用那种解析器,对于HTML来讲就是html.parser,这个是bs4自带的解析器。

如果一段HTML或XML文档格式不正确的话,那么在不同的解析器中返回的结果可能是不一样的。

解析器使用方法优势
python标准库BeautifulSoup(html, “html.parser”)1、Python的内置标准库
2、执行速度适中
3、文档容错能力强
lxml HTMLBeautifulSoup(html, “lxml”)1.速度快
2.文档容错能力强
lxml XMLBeautifulSoup(html, [“lxml”, “xml”]) BeautifulSoup(html, “xml”)1.速度快
2.唯一支持XML的解析器
html5libBeautifulSoup(html, “html5lib”)1.做好的容错性
2.以游览器的方式解析文档
3.生成HTML5的文档

4.然后通过这个对象来实现对获取到的源码进行筛选和处理

print(bs_1.prettify()) #格式化输出全部内容

print(bs_1.标签名)

#标签名有html,head,title,meta,body,script,style等等

三、BeautifulSoup四大对象种类

Beautiful Soup 将复杂HTML文档转换成一个复杂的树形结构,每个节点都是 Python 对象,所有对象可以归纳为4种

(1)tag

Tag对象与 xml 或 html 原生文档中的 tag 相同。

bs_1=BeautifulSoup(r1.text,'lxml')
tag = bs_1.head
print(type(tag))
#<class 'bs4.element.Tag'>

如果不存在,则返回 None,如果存在多个,则返回第一个。

  • Name :每个 tag 都有自己的名字
tag.name
# 'head'
  • Attributes:tag 的属性是一个字典
tag['class']
# 'boldest'

tag.attrs
# {'class': 'boldest'}

type(tag.attrs)
# <class 'dict'>
  • 多值属性:最常见的多值属性是class,多值属性的返回 list
soup = BeautifulSoup('<p class=""></p>')

print(soup.p['class'])  # ['body', '']

print(soup.p.attrs)     # {'class': ['body', 'aaa']}

如果某个属性看起来好像有多个值,但在任何版本的HTML定义中都没有被定义为多值属性,那么Beautiful Soup会将这个属性作为字符串返回。

a1 = BeautifulSoup('<p id="my id"></p>', 'html.parser')
print(a1.p['id'])    # 'my id'
  • Text:返回 tag 的所有字符串连成的字符串

  • 其他方法
tag.has_attr('id')  #返回 tag 是否包含 id 属性

以上代码还可以写成 ’ id ’ in tag.attrs 的形式,之前说过,tag 的属性是一个字典。

(2)NavigableString

字符串常被包含在 tag 内,Beautiful Soup 用 NavigableString 类来包装 tag 中的字符串。但是字符串中不能包含其他 tag。

a1 = BeautifulSoup('<b class="aaa">bbb</b>')

s = a1.b.string

print(s)        # bbb

print(type(s))  # <class 'bs4.element.NavigableString'>

(3)BeautifulSoup

BeautifulSoup 对象表示的是一个文档的全部内容。大部分时候,可以把它当作 Tag 对象。但是 BeautifulSoup 对象并不是真正的 HTM L或 XML 的 tag,它没有attribute属性,name 属性是一个值为“[document]”的特殊属性。

(4)Comment

comment一般表示文档的注释部分

a1 = BeautifulSoup("<b><!--This is a comment--></b>")

comment = a1.b.string

print(comment)          # This is a comment

print(type(comment))    # <class 'bs4.element.Comment'>

四、CSS选择器

css的规则

标签名不加任何修饰,类名前加点,id名前加#,在这里用的方法大致是一样的,用到的方法是bs_1.select(),它的返回值是一个列表list

  1. 通过标签名字

    print bs_1.select('title')
    
  2. 通过类名

    print bs_1.select('.class')
    
  3. 通过id

    print bs_1.select('#a_1')
    

组合查找

这里和在写css的格式是一样的

print bs_1.select('.class #id')

#意思是查找.class类下的id是id的元素

子查询

print bs_1.select('head > title')

属性查找

print bs_1.select(p[class="new"])
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐