Beautiful Soup:修订间差异

无编辑摘要
无编辑摘要
第254行: 第254行:
|
|
|
|
|-
|}
===回退和前进===
{| class="wikitable"  style="width: 100%;
! 属性
! 描述
! 示例
|-
|.next_element
| 属性指向解析过程中下一个被解析的对象(字符串或tag),结果可能与 .next_sibling 相同,但通常是不一样的.
|<code>tag.next_element</code>
|-
|.previous_element
|
|<code>tag.previous_element</code>
|-
|.next_elements 和
|
|<code>tag.next_elements </code>
|-
|.previous_elements
|
|<code>tag.previous_elements</code>
|-
|-
|}
|}


==搜索文档树==
==搜索文档树==
Beautiful Soup定义了很多搜索方法,find_all()几乎是Beautiful Soup中最常用的搜索方法。
{| class="wikitable"  style="width: 100%;
! 方法
! 描述
! 示例
|-
|find_all()
|返回文档中符合条件的所有节点对象
|
|-
|find()
|
|soup.find('title')
|-
|find_parents()
|
|
|-
|find_parent()
|
|
|-
|find_next_siblings()
|
|
|-
|find_next_sibling()
|
|
|-
|find_previous_siblings()
|
|
|-
|find_previous_sibling()
|
|
|-
|find_all_next()
|
|
|-
|find_next()
|
|
|-
|find_all_previous()
|
|
|-
|find_previous()
|
|
|-
|select()
|使用CSS选择器的语法找到tag,在 Tag 或 BeautifulSoup 对象的select() 方法中传入字符串参数即可。如果仅需要CSS选择器的功能,那么可以直接使用[[lxml]]。
|<code>bs.select("p > #toc")</code>
|}
===参数===
12个find开头的方法,其参数和用法类似,格式都为:
function( name , attrs , recursive , string , **kwargs )


这些方法的参数如下:
{| class="wikitable"  style="width: 100%;
! 参数
! 描述
! 示例
|-
|name
|查找名称为name的tag,字符串对象会被自动忽略掉。 name参数的值可以是任一类型的过滤器(字符串,正则表达式,列表,方法或是True)
|<code>bs.find_all("title")</code>查找所有名为title的tag
|}


===CSS选择器===


==资源==
==资源==

2020年11月9日 (一) 16:22的版本

Beautiful Soup是一个Python库,能够方便的从HTMLXML文件中提取数据。

简介

时间轴

安装

可以通过下面3中方式安装Beautiful Soup 4。

通过pip安装

Beautiful Soup 4 发布在PyPI平台上,所以可以使用pip来安装:

pip install beautifulsoup4

通过软件包管理安装

如果你用的是新版的DebainUbuntu,那么也可以通过系统的软件包管理来安装:

apt-get install Python-bs4

下载源代码安装

下载BS4的源码,然后通过setup.py来安装。

Python setup.py install

了解更多 >> Beautiful Soup 4 文档:安装Beautiful Soup


基础知识

获取页面

获取页面可以使用Python的urllib标准库下的request模块或requests库。

下面使用requests库获取页面,然后使用BeautifulSoup提取body标签。

import requests

response = requests.get('https://www.baidu.com')

bs = BeautifulSoup(response.content, 'html.parser')
tag = bs.body

使用Python的request模块获取页面,然后使用BeautifulSoup提取标题字符串。示例如下:

from urllib.request import urlopen
from bs4 import BeautifulSoup

html = urlopen('https://www.baidu.com')

bs = BeautifulSoup(html.read(), 'html.parser')
title = str(bs.title.string)  #标题内容


文档解析器

Beautiful Soup支持Python标准库的HTML解析器 html.parser,还支持一些第三方的解析器。如果未通过参数设置指定的解析器,Beautiful Soup会自动选择一个已安装的,优先数序:lxmlhtml5libhtml.parser。不同的解析器得到的结果可能不同,所以防止程序的不稳定,最好指定解析器。支持解析的文档格式有HTML、HTML5和XML,其中只有lxml解析器支持解析XML文档。下表为当前支持的解析器:

解析器 描述 安装 用法
Python标准库 html.parser 速度中,Python的内置标准库 不需要安装 BeautifulSoup(markup, "html.parser")
lxml 的 HTML解析器 速度快 pip install lxml BeautifulSoup(markup, "lxml")
lxml 的 XML 解析器 速度快,唯一支持XML的解析器 pip install lxml BeautifulSoup(markup, ["lxml-xml"])
BeautifulSoup(markup, "xml")
html5lib 速度慢,最好的容错性,以浏览器的方式解析文档,生成HTML5格式的文档 pip install html5lib BeautifulSoup(markup, "html5lib")


了解更多 >> BeautifulSoup 4 文档:安装解析器 BeautifulSoup 4 文档:指定文档解析器


对象

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

描述 对象生成 对象操作
BeautifulSoup BeautifulSoup 对象表示的是一个文档的全部内容。基本上可以当作Tag对象,支持遍历文档树和搜索文档树中描述的大部分的方法。 BeautifulSoup(markup, "html.parser")
Tag Tag对象与XML或HTML原生文档中的tag(标签)相同。 通过BeautifulSoup对象遍历文档树或搜索文档树生成。如bs表示一个BeautifulSoup对象,bs.p 标签名称通过对象.name获取,如tag.name。
标签的某个属性可以通过对象的.属性名[属性名]操作获取,如tag['class']或tag.class
标签的所有属性可以通过对象的.attrs获取,返回字典类型。
NavigableString tag中的字符串被封装在NavigableString类中。一个 NavigableString 字符串与Python中的Unicode字符串相同,并且还支持包含在 遍历文档树 和 搜索文档树 中的一些特性。 通过Tag对象string属性生成。
tag.string
Comment 文档的注释部分包装在Comment类中,Comment 对象是一个特殊类型的 NavigableString 对象。 通过Tag对象string属性生成。
tag.string

了解更多 >> BeautifulSoup 4 文档:对象的种类


BeautifulSoup

BeautifulSoup 对象表示的是一个文档的全部内容。大部分时候,可以把它当作 Tag 对象,它支持 遍历文档树 和 搜索文档树 中描述的大部分的方法。因为 BeautifulSoup 对象并不是真正的HTML或XML的tag,所以它没有name和attribute属性。

如下生成一个BeautifulSoup 对象 bs,其中markup表示文档内容:

bs = BeautifulSoup(markup, "html.parser")

Tag

Tag对象与XMLHTML原生文档中的tag相同,Tag有很多方法和属性,最重要的两个属性为name和attributes。示例如下:

bs = BeautifulSoup('<b class="boldest">Extremely bold</b>')
tag = bs.b    #生成一个tag对象
type(tag)     # <class 'bs4.element.Tag'>

#获取该标签的名字
tag.name     #'b'
tag.name = "blockquote"  也可以改变标签名称

#获取属性
tag.attrs      # 获取标签的所有属性,{'class': 'boldest'}
tag['class']   # 获取某个属性的值,['boldest']

#添加,删除,修改操作方法和字典一样。
tag['class'] = 'verybold'   #修改tag的class属性值为verybold
tag['id'] = 1               #tag添加一个id="1"的属性
del tag['id']               #删除tag的id属性


NavigableString

字符串常被包含在标签tag内。Beautiful Soup用 NavigableString 类来包装tag中的字符串。使用.string一个 NavigableString 字符串与Python中的Unicode字符串相同,并且还支持包含在遍历文档树和搜索文档树中的一些特性。通过Python的 str() 方法可以直接将 NavigableString 对象转换成Unicode字符串:

from urllib.request import urlopen
from bs4 import BeautifulSoup
html = urlopen('https://www.baidu.com')
bs = BeautifulSoup(html.read(), 'html.parser')
tag = bs.title

tag.string         #'百度一下,你就知道'
type(tag.string)   # <class 'bs4.element.NavigableString'>

title = str(tag.string)    #'百度一下,你就知道'
type(title)   # 字符串

Comment

Comment是文档的注释及特殊字符串,Comment 对象是一个特殊类型的 NavigableString 对象。

markup = "<b><!--Hey, buddy. Want to buy a used parser?--></b>"
soup = BeautifulSoup(markup)

comment1 = soup.b.string
type(comment1)    # <class 'bs4.element.Comment'> 
comment1          # 'Hey, buddy. Want to buy a used parser'

遍历文档树

子节点

一个Tag可能包含多个字符串或其它的Tag,这些都是这个Tag的子节点。Beautiful Soup提供了许多操作和遍历子节点的属性。操作文档树最简单的方法就是告诉它你想获取的tag的name。

下表中bs为一个BeautifulSoup对象,tag为一个Tag对象:

属性 描述 示例
.标签名称 获取对象第一个该名称标签。 bs.p获取bs的第一个名称为p的标签。
bs.p.b
.contents 以列表形式输出对象的子节点。只包括子代节点。 bs.contents
.children 返回一个所有子节点list_iterator迭代器。只包括子代节点。 bs.children
.descendants 返回一个递归的子孙节点生成器。 bs.descendants
.string 返回节点NavigableString对象,当该节点有多个NavigableString对象,返回空。 tag.string
.strings 返回节点所有NavigableString对象生成器。 tag.strings
.stripped_strings 与.strings一样,但会去掉字符串中多余的空格或空行 tag.stripped_strings


父节点

每个Tag或NavigableString都有父节点,包含在该节点中。如下:

属性 描述 示例
.parent 获取某个元素的父节点 tag.parent
.parents

兄弟节点

属性 描述 示例
.next_sibling tag.next_sibling
.previous_sibling
.next_siblings tag.next_sibling
.previous_siblings

回退和前进

属性 描述 示例
.next_element 属性指向解析过程中下一个被解析的对象(字符串或tag),结果可能与 .next_sibling 相同,但通常是不一样的. tag.next_element
.previous_element tag.previous_element
.next_elements 和 tag.next_elements
.previous_elements tag.previous_elements

搜索文档树

Beautiful Soup定义了很多搜索方法,find_all()几乎是Beautiful Soup中最常用的搜索方法。

方法 描述 示例
find_all() 返回文档中符合条件的所有节点对象
find() soup.find('title')
find_parents()
find_parent()
find_next_siblings()
find_next_sibling()
find_previous_siblings()
find_previous_sibling()
find_all_next()
find_next()
find_all_previous()
find_previous()
select() 使用CSS选择器的语法找到tag,在 Tag 或 BeautifulSoup 对象的select() 方法中传入字符串参数即可。如果仅需要CSS选择器的功能,那么可以直接使用lxml bs.select("p > #toc")

参数

12个find开头的方法,其参数和用法类似,格式都为:

function( name , attrs , recursive , string , **kwargs )

这些方法的参数如下:

参数 描述 示例
name 查找名称为name的tag,字符串对象会被自动忽略掉。 name参数的值可以是任一类型的过滤器(字符串,正则表达式,列表,方法或是True) bs.find_all("title")查找所有名为title的tag

CSS选择器

资源

网站

参考文献