2.9.2.2Python-解析库_BeatifulSoup

总目录:https://www.jianshu.com/p/e406a9bc93a9

Python-爬虫 - 子目录:https://www.jianshu.com/p/23cf57674bf1

2.9.2.2Python-解析库_BeatifulSoup_第1张图片

官方文档: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标签

        python

    

"""

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标签

        python

    

"""

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标签

        python

    

"""

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标签

        python

    

"""

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标签

        python

    

"""

soup = BeautifulSoup(text, "html.parser")

print(soup.body)

print(soup.body.p)

print(soup.body.p.string)


BeautifulSoup

如何使用BeautifulSoup

第二个p标签

python

如何使用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标签

        python

    

"""

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标签

        python

    

"""

soup = BeautifulSoup(text, "html.parser")

body_tag = soup.body

print(body_tag.find("a"))

print(body_tag.find("p"))

python 

如何使用BeautifulSoup


get_text()

获取标签里面内容,除了可以使用 .string 之外,还可以使用 get_text 方法.

不同的地方在于前者返回的一个 NavigableString 对象,后者返回的是 unicode 类型的字符串。


from bs4 import BeautifulSoup

text ="""

    

        hello, world

    

    

        

BeautifulSoup

        

如何使用BeautifulSoup

        

第二个p标签

        python

    

"""

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

你可能感兴趣的:(2.9.2.2Python-解析库_BeatifulSoup)