总目录:https://www.jianshu.com/p/e406a9bc93a9
Python-爬虫 - 子目录:https://www.jianshu.com/p/23cf57674bf1
官方文档:https://beautifulsoup.readthedocs.io/zh_CN/latest/
什么是BeautifulSoup
BeautifulSoup 是一个用于解析 HTML 文档的 Python 库,通过 BeautifulSoup,你只需要用很少的代码就可以提取出 HTML 中任何感兴趣的内容.
此外,它还有一定的 HTML 容错能力,对于一个格式不完整的HTML 文档,它也可以正确处理。
学习前了解一下
hello, world
BeautifulSoup
如何使用BeautifulSoup
它由很多标签(Tag)组成,比如 html、head、title等等都是标签
一个标签对构成一个节点,比如 ... 是一个根节点
节点之间存在某种关系,比如 h1 和 p 互为邻居,他们是相邻的兄弟(sibling)节点
h1 是 body 的直接子(children)节点,还是 html 的子孙(descendants)节点
body 是 p 的父(parent)节点,html 是 p 的祖辈(parents)节点
嵌套在标签之间的字符串是该节点下的一个特殊子节点,比如 “hello, world” 也是一个节点,只不过没名字。
简单用法
from bs4 import BeautifulSoup
text ="""
hello, world
BeautifulSoup
如何使用BeautifulSoup
第二个p标签
"""
soup = BeautifulSoup(text, "html.parser")
# title 标签
print(soup.title)
# p 标签
print(soup.p)
# p 标签的内容
print(soup.p.string)
hello, world 如何使用BeautifulSoup
如何使用BeautifulSoup
数据类型
BeatifulSoup将 HTML抽象成为 4 类主要的数据类型。
分别是Tag, NavigableString, BeautifulSoup,Comment。
每个标签节点就是一个Tag对象,NavigableString对象一般是包裹在Tag对象中的字符串,BeautifulSoup对象代表整个 HTML文档。
from bs4 import BeautifulSoup
text ="""
hello, world
BeautifulSoup
如何使用BeautifulSoup
第二个p标签
"""
soup = BeautifulSoup(text, "html.parser")
print(type(soup))
print(type(soup.p))
print(type(soup.p.string))
Tag
每个 Tag 都有一个名字,它对应 HTML 的标签名称。
from bs4 import BeautifulSoup
text ="""
hello, world
BeautifulSoup
如何使用BeautifulSoup
第二个p标签
"""
soup = BeautifulSoup(text, "html.parser")
print(soup.h1.name)
print(soup.p.name)
h1
p
NavigableString
获取标签中的内容,直接使用 .stirng 即可获取
from bs4 import BeautifulSoup
text ="""
hello, world
BeautifulSoup
如何使用BeautifulSoup
第二个p标签
"""
soup = BeautifulSoup(text, "html.parser")
print(soup.p.string)
print(type(soup.p.string))
如何使用BeautifulSoup
文档树操作
遍历文档树
遍历文档树,顾名思义,就是是从根节点html 标签开始遍历,直到找到目标元素为止。
遍历的一个缺陷是,如果你要找的内容在文档的末尾,那么它要遍历整个文档才能找到它,速度上就慢了。
from bs4 import BeautifulSoup
text ="""
hello, world
BeautifulSoup
如何使用BeautifulSoup
第二个p标签
"""
soup = BeautifulSoup(text, "html.parser")
print(soup.body)
print(soup.body.p)
print(soup.body.p.string)
BeautifulSoup
如何使用BeautifulSoup
第二个p标签
如何使用BeautifulSoup
如何使用BeautifulSoup
前面说了,内容也是一个节点,这里就可以用.string 的方式得到。
遍历文档树的另一个缺点是只能获取到与之匹配的第一个子节点,例如,如果有两个相邻的p 标签时,第二个标签就没法通过.p 的方式获取.
这是需要借用next_sibling 属性获取相邻且在后面的节点。
搜索文档树
搜索文档树是通过指定标签名来搜索元素,另外还可以通过指定标签的属性值来精确定位某个节点元素,最常用的两个方法就是 find 和 find_all。
find_all
语法:
find_all( name , attrs , recursive , text , **kwargs )
find_all 的返回值是一个 Tag 组成的列表,方法调用非常灵活,所有的参数都是可选的。
from bs4 import BeautifulSoup
text ="""
hello, world
BeautifulSoup
如何使用BeautifulSoup
第二个p标签
"""
soup = BeautifulSoup(text, "html.parser")
#第一个参数name是标签节点的名字
print(soup.find_all("title"))
print(soup.find_all("p"))
[
hello, world ][
如何使用BeautifulSoup
,第二个p标签
]
#第二个参数attrs是class值
print(soup.find_all("p", "big"))
#等效于soup.find_all("p", class_="big") 因为 class 是 Python 关键字,所以这里指定为 class_。
[
第二个p标签
]
#第五个参数kwargs是标签的属性名值对
print(soup.find_all(href="http://foofish.net"))
[python]
#同时他还支持正则
import re
print(soup.find_all(href=re.compile("^http")))
[python]
#属性除了可以是具体的值、正则表达式之外,它还可以是一个布尔值(True/Flase),表示有属性或者没有该属性。
print(soup.find_all(id="key1"))
print(soup.find_all(id=True))
[
第二个p标签
]
[
第二个p标签
]
#搜索和遍历相结合
#先定位到 body 标签,缩小搜索范围,再从 body 中找 a 标签。
body_tag = soup.body
print(body_tag.find_all("a"))
[python]
find
find 方法跟 find_all 类似,唯一不同的地方是,它返回的单个 Tag 对象而非列表,如果没找到匹配的节点则返回 None。如果匹配多个 Tag,只返回第0个。
from bs4 import BeautifulSoup
text ="""
hello, world
BeautifulSoup
如何使用BeautifulSoup
第二个p标签
"""
soup = BeautifulSoup(text, "html.parser")
body_tag = soup.body
print(body_tag.find("a"))
print(body_tag.find("p"))
如何使用BeautifulSoup
get_text()
获取标签里面内容,除了可以使用 .string 之外,还可以使用 get_text 方法.
不同的地方在于前者返回的一个 NavigableString 对象,后者返回的是 unicode 类型的字符串。
from bs4 import BeautifulSoup
text ="""
hello, world
BeautifulSoup
如何使用BeautifulSoup
第二个p标签
"""
soup = BeautifulSoup(text, "html.parser")
body_tag = soup.body
p1 = body_tag.find('p').get_text()
print(type(p1))
print(p1)
如何使用BeautifulSoup
p2 = body_tag.find("p").string
print(type(p2))
print(p2)
如何使用BeautifulSoup