BeautifulSoup4基础

一 实例html

案例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 beautifulsoup4

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'>

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=None, attrs={}, recursive=True, text=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”]))
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值