欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

BeautifulSoup使用

程序员文章站 2022-05-18 18:07:04
一实例htmlbs4.htmlbs4_text

一 实例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