BeautifulSoup


BeautifulSoup库的名字取自刘易斯·卡罗尔在《爱丽丝梦游仙境》里的同名诗歌,在故事中,这首歌是素甲鱼唱的。
就像它在仙境中的说法一样,BeautifulSoup尝试化平淡为神奇,它通过定位HTML标签来格式化和组织复杂的网络信息,用简单易用的Python对象为我们展现XML结构信息。

安装BeautifulSoup

BeautifulSoup库不是Python标准库,所以需要单独安装,我将使用Beautiful 4版本(BS 4),附安装方法

  • Linux基本安装方法是:
$sudo apt-get install python-bs4
  • Mac系统
$sudo easy_install pip
  • 安装Python包管理器pip,然后运行
$pip install beautifulsoup4
  • 如果你的设备同时安装了 Python 3.x 和Python 2.x,你需要用Python3来运行
$python3 myScript.py
  • 当你安装包,如果有可能安装到了Python 2.x而不是Python 3.x里,就需要使用
$sudo Ptrhon3 setup.py install
  • 如果使用pip安装,你还可以用pip3安装Python 3.x版本的包
$pip3 install beautifulsoup4

Beautiful Soup 4 通过PyPi发布,所以如果你无法使用系统包管理安装,那么也可以通过 easy_install 或 pip 来安装.包的名字是 beautifulsoup4 ,这个包兼容Python2和Python3.

$ easy_install beautifulsoup4
$ pip install beautifulsoup4

(在PyPi中还有一个名字是 BeautifulSoup 的包,但那可能不是你想要的,那是 Beautiful Soup3 的发布版本,因为很多项目还在使用BS3, 所以 BeautifulSoup 包依然有效.但是如果你在编写新项目,那么你应该安装的 beautifulsoup4 )

如果你没有安装 easy_install 或 pip ,那你也可以 下载BS4的源码 ,然后通过setup.py来安装.

$ Python setup.py install

如果上述安装方法都行不通,Beautiful Soup的发布协议允许你将BS4的代码打包在你的项目中,这样无须安装即可使用.

作者在Python2.7和Python3.2的版本下开发Beautiful Soup, 理论上Beautiful Soup应该在所有当前的Python版本中正常工作
## 安装解析器
Beautiful Soup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,其中一个是 lxml .根据操作系统不同,可以选择下列方法来安装lxml:

$ apt-get install Python-lxml
$ easy_install lxml
$ pip install lxml


另一个可供选择的解析器是纯Python实现的 html5lib , html5lib的解析方式与浏览器相同,可以选择下列方法来安装html5lib:

$ apt-get install Python-html5lib
$ easy_install html5lib
$ pip install html5lib

下表是解析器和他们的不同

初入殿堂

如何使用

from bs4 import BeautifulSoup
soup = BeautifulSoup(open("index.html"))
soup = BeautifulSoup("<html>data</html>")

使用find()方法获取到的结果都是Tag对象,这也是BeautifulSoup库中的主要对象之一,Tag对象在逻辑上和XML和HTML文档中的tag相同,可以使用tag.name和tag.attrs来访问Tag对象的名字和属性,获取属性值的方法类似字典:tag['href']

  • 在定位内容,最常用的就是find()和find_all()方法,find_all()方法的定义是:
    find_all(name,attrs,recursive,text,**kwargs)

对标题的一次输出

from urllib.request import urlopen
from bs4 import BeautifulSoup
html = urlopen("http://www.keanes.cn")
bsObj = BeautifulSoup(html.read(),'lxml')           # 需要默认调用lxml作为解析器,不调用也没关系,不过会报警告
print(bsObj.h1)

关于上面代码最后一行的bsObj.h1,这里的h1可以换成html,body,h1,这是根据网页html代码的结构来进行的选择输出。具体结构如下:

- <html>
    - <head>
        - <title>
    - <body>
        - <h1>
        - <div>

CSS

每个网站都会有 层叠样式表(Cascading Style SHeet,CSS),CSS可以让HTML元素呈现出差异化,使那些具有完全相同修饰的元素呈现出不同的样式

from urllib.request import urlopen
from bs4 import BeautifulSoup
html = urlopen("http://pythonscraping.com/pages/warandpeace.html")
bsObj = BeautifulSoup(html)
nameList = bsObj.findAll("span",{"class":"green"})
for name in nameList:
    print(name.get_text())

上面的代码通过抽取标签中的属性,对颜色进行了筛选。

最后修改:2021 年 03 月 08 日
如果觉得我的文章对你有用,请随意赞赏