当前位置: 移动技术网 > IT编程>网页制作>HTML > BeautifulSoup使用

BeautifulSoup使用

2020年07月22日  | 移动技术网IT编程  | 我要评论

一 实例html

bs4.html

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <title>bs4_text</title>

</head>

<body>

    <div id = "id1" name = "div1" class = "div_class1">

        <!-- div1的注释 -->

        <h1><!-- h1注释 --></h1>

        <h2><!-- h2注释 -->h2的内容</h2>

        <a class = "a_class1" href = "http://www.baidu.com">

            baidu

        </a>

        <a class = "a_class1" href = "http://www.taobao.com">taobao</a>

        <span>

            <span>span_text</span>

        </span>

    </div>

    <div id = "id2" name = 'div2' class = "div_class2">

        <a class = "a_class2" href = "http://www.jd.com"></a>

        <a class = "a_class2" href = "http://www.vip.com">vip</a>

    </div>

</body>

</html>

 

 

 

str与BeautifulSoup互相转换

2.1安装bs4:

pip install bs4

2.2使用bs4的BeautifulSoup

from bs4 import BeautifulSoup

# 1.加载html

with open(bs4.html,r,encoding=utf-8) as f:

html = f.read()

# 2.str转BeautifulSoup对象
bs = BeautifulSoup(html)

# 3.BeautifulSoup对象转str

html_str1 = str(bs)

html_str2 = bs.prettify()

 

 

三、四大对象

3.1 Tag对象(两个重要属性:name和attrs)

div_tag = bs.div      # 根据标签名字取对象,只会拿到匹配到的第一个对象

print(div_tag) 

print(type(div_tag))   # <class 'bs4.element.Tag'>

# 1. name属性

print(div_tag.name)  # div

# 2.attrs 属性

print(div_tag.attrs)   # {'id': 'id1', 'name': 'div1', 'class': ['div_class1']}

# 3.取属性值

print(div_tag[id])    # id1

 

# 4.组合

print(div_tag.a[‘class’]) # ['a_class1']

 

命令

解释

BeautifulSoup.标签名

得到匹配到的第一个tag对象

Tag.name

得到这个tag的标签名

Tag.attrs

字典的形式返回属性键值对

Tag[key]

得到这个Tag对象key属性对应的value

3.2 NavigableString文本对象

string = bs.div.a.string    

print(string)            #       baidu(不会删除多余的空格)

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

text = bs.div.a.get_text()

print(text)             #       baidu(不会删除多余的空格)

print(type(text))        #<class 'str'>

 

命令

解释

Tag.string

返回html中的元素,类型是NavigableString

Tag.get_text()

返回html中的元素,类型是str

3.3 BeautifulSoup对象

print(type(bs))    # <class 'bs4.BeautifulSoup'>

可以把BeautifulSoup对象看成一个Tag对象

3.4 Comment注释对象

# string

obj1 = bs.div.h1.string

obj2 = bs.div.h2.string

print(obj1)          # h1注释

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

print(obj2)          # None

print(type(obj2))     # <class 'NoneType'>

# get_text()

obj3 = bs.div.h2.get_text()
print(obj3)          #h2的内容

print(type(obj3))     # <class 'str'>

 

 

.string

.get_text()

元素只有注释

得到注释内容(去掉注释符号)对象类型:Comment

得到注释内容(去掉注释符号)对象类型:str

元素只有文本

NavigableString对象的文本

str对象的文本

元素既有注释又有文本

None

只得到文本内容

 

 

、两类节点

4.1子节点contents和children

contents = bs.div.contents

print(contents)            # 返回一个列表,以行为单位划分

children = bs.div.children

print(children)             # 返回一个list生成器对象

for obj in children:

    print(obj)

 

命令

解释

.contents

返回一个以行为划分方式的列表

.children

返回一个list生成器对象

4.2 子孙节点descendants

descendants = bs.div.descendants 

print(descendants)               # <generator object descendants at…>生成器对象
for obj in decendants:

    print(obj)

 

命令

解释

descendants

返回一个生成器对象

 

 

 

五、搜索方式

5.1 find和find_all

find返回匹配成功的第一个对象,find_all返回所有

5.1.1构造方法:

def find(self, name=Noneattrs={}, recursive=Truetext=None,
         **kwargs):

def find_all(self, name=None, attrs={}, recursive=True, text=None,

             limit=None, **kwargs):

 

参数

解释

name

标签值

attrs

属性值

recursive

是否递归遍历所有子孙节点

text

文本

limit

结果的数量

**kwargs

属性值

 

5.1.2 name——str和list:

ret1 = bs.find_all(name=div)       # 标签名是div

print(ret1)

ret2 = bs.find_all(name=[a,span])  # 标签名是a或span

print(ret2)

5.1.3 name——正则 :

import re 

pattern = re.compile(.*?iv)

ret3 = bs.find(name=pattern)

print(ret3)

 

5.1.4 attrs 和**kwagrs:

ret4 = bs.find_all(attrs = {class:a_class1})

print(ret4)

# 理论上相当于

ret5 = bs.find(class = a_class1)   # 但因为class是关键字,不能这么写

# 如果是id,就可以:

ret6 = bs.find(id = “….)

5.1.5 text

taobao = bs.find_all(text='taobao')

print(taobao)                             # ['taobao']

baidu = bs.find_all(text='baidu') 

print(baidu)                              # []

pattern = re.compile('\n*?.*?baidu\n*?.*?')

baidu = bs.find_all(text=pattern)             # ['\n            baidu\n        ']

print(baidu)

5.2 select和select_all(css选择器)

select_one返回满足的第一个,select返回所有

5.2.1构造方法:

def select_one(self, selector, namespaces=None, **kwargs):

def select(self, selector, namespaces=None, limit=None, **kwargs):

 

 

5.2.2根据标签查找

div = bs.select(div)

print(div)

print(len(div))

print(div[0].prettify())    # 转str

print(div[0].get_text())   # div中的所有text

5.2.3 根据类名查找

class1 = bs.select(.a_class1)

5.2.4 根据id查找

id1 = bs.select(#id1)

5.2.5 组合查找

print(div > .a_class1)

print(.div_class1 > .a_class1)

print(div > a)

print(#id1 > span)

注:

  1. >可以省略,只写空格
  2. 组合查找并不是并列关系,而是递进

5.2.6属性查找

print(bs.select(a[class=a_class1]))

print(bs.select(div > a[class=a_class1]))

 

本文地址:https://blog.csdn.net/kzl_knight/article/details/107500861

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网