美文网首页爬虫
4-Beautiful Soup库的使用

4-Beautiful Soup库的使用

作者: 撸撸很乖张 | 来源:发表于2018-08-10 02:46 被阅读2次

bs4的基本适用

from bs4 import BeautifulSoup
html = """
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>bs4 demo</title>
</head>
<body>
<div class='div_demo' id='div'>
    <p><span>Hello</span> world</p>
    <a href="">新闻</a>
</div>
<div> </div>

</body>
"""

soup = BeautifulSoup(html, 'lxml')
# 1.按tag查找
# print(soup.get_text())
# print(soup.title.get_text())

# 2.find
soup.find(name='a')
soup.find(name='body').find(name='a')

# 3.获取元素文本
print(soup.div.p.get_text())
print(soup.div.p.string) # 节点不能再有子节点

# 4.获取属性值
print(soup.div.attrs)  # {'class': ['div_demo'], 'id': 'div'}
print(soup.div.get('id')) # div

# 5.find_all findAll

soup.find_all(name='div', attrs={}, recursive=True, text='', class_='', limit=2)
"""
- name :tag name
- attrs:tag的属性
- recursive:是否递归 默认True
- text:按tag显示的内容查找
- limit:限制找到的结果的个数
"""
soup.find(name='div', attrs={}, recursive=True, text='', class_='')

print(soup.find(name='div', attrs={'class':'div_demo'}))

Beautiful Soup库的引用

Beautiful Soup对应一个HTML/XML文档的全部内容

from bs4 import BeautifulSoup

#两种引用的方法
soup = BeautifulSoup("<html>data</html>","html.parser")
soup2 = BeautifulSoup(open("D://demo.html"),"html.parser")

Beautiful Soup库解析器

解析器 使用方法 条件
bs4的HTML解析器 BeautifulSoup(mk,'html.parser') 安装bs4库
lxml的HTML解析器 BeautifulSoup(mk,'lxml') pip install lxml
lxml的XML解析器 BeautifulSoup(mk,'xml') pip install lxml
html5lib的解析器 BeautifulSoup(mk,'html5lib') pip install html5lib

bs4库的prettify()方法

.prettify()为HTML文本<>及其内容增加\n,让页面显示更加友好。
.prettify()可用于标签,方法:<tag>.prettify()

print(soup.a.prettify())

BeautifulSoup类的基本元素

<p class=“title”> … </p>

基本元素 s说明
Tag 标签,最基本的信息组织单元,分别用<>和</>标明开头和结尾
Name 标签的名字,<p>…</p>的名字是'p',格式:<tag>.name
Attributes 标签的属性,字典形式组织,格式:<tag>.attrs
NavigableString 标签内非属性字符串,<>…</>中字符串,格式:<tag>.string
Comment 标签内字符串的注释部分,一种特殊的Comment类型

标签树的下行遍历

属性 说明
.contents 子节点的列表,将<tag>所有儿子节点存入列表
.children 子节点的迭代类型,与.contents类似,用于循环遍历儿子节点
.descendants 子孙节点的迭代类型,包含所有子孙节点,用于循环遍历

标签树的上行遍历

属性 说明
.parent 节点的父亲标签
.parents 节点先辈标签的迭代类型,用于循环遍历先辈节点

标签树的平行遍历

同一个父标签下的兄弟节点才是平行节点。

属性 说明
.next_sibling 返回按照HTML文本顺序的下一个平行节点标签
.next_siblings 迭代类型,返回按照HTML文本顺序的后续所有平行节点标签
.previous_sibling 返回按照HTML文本顺序的上一个平行节点标签
.previous_siblings 迭代类型,返回按照HTML文本顺序的前续所有平行节点标签

信息标记与提取方法

信息的标记

标记后的信息可形成信息组织结构,增加了信息维度
标记的结构与信息一样具有重要价值
标记后的信息可用于通信、存储或展示
标记后的信息更利于程序理解和运用

三种标记形式

  1. XML

    • 最早的通用信息标记语言,可扩展性好,但繁琐。
    • Internet上的信息交互与传递
    <img src=“china.jpg” size=“10” />
    空元素的缩写形式
    <!‐‐ This is a comment, very useful ‐‐>
    注释书写形式
    
    <name> … </name>
    <name />
    <!‐‐ ‐‐>
    

  2. JSON

    • 信息有类型,适合程序处理(js),较XML简洁。
    • 移动应用云端和节点的信息通信,无注释。
    # 有类型的键值对key:value
    “name” : “北京理工大学”
    

    Json实例:

    {
      “firstName” : “Tian” ,
      “lastName” : “Song” ,
      “address” : {
                  “streetAddr” : “中关村南大街5号” ,
                  “city” : “北京市” ,
                  “zipcode” : “100081”
                  } ,
       “prof” : [ “Computer System” , “Security” ]
    }
    

  3. YAML

  • 信息无类型,文本信息比例最高,可读性好。
  • 各类系统的配置文件,有注释易读。
# 无类型的键值对key:value
“name” : “北京理工大学”
# 缩进表达所属关系
name :
    newName : 北京理工大学
    oldName : 延安自然科学院
# ‐ 表达并列关系
name :
‐北京理工大学
‐延安自然科学院
# | 表达整块数据   # 表示注释
text: |   #学校介绍
北京理工大学创立于1940年,前身是延安自然科学院,是中国共产党创办的第一所理工科大学,毛泽东同志亲
自题写校名,李富春、徐特立、李强等老一辈无产阶级革命家先后担任学校主要领导。学校是新中国成立以来
国家历批次重点建设的高校,首批进入国家“211工程”和“985工程”建设行列;在全球具有广泛影响力的英
国QS“世界大学500强”中,位列入选的中国大陆高校第15位。学校现隶属于工业和信息化部。

key : value
key : #Comment
‐value1
‐value2
key :
    subkey : subvalue

YAML实例:

firstName : Tian
lastName  : Song
address   :
    streetAddr : 中关村南大街5号
    city       : 北京市
    zipcode    : 100081
prof :
‐Computer System
‐Security

基于bs4的HTML内容查找

find_all()方法

<>.find_all(name, attrs, recursive, string, **kwargs)
∙ name : 对标签名称的检索字符串
∙ attrs: 对标签属性值的检索字符串,可标注属性检索
∙ recursive: 是否对子孙全部检索,默认True
∙ string: <>…</>中字符串区域的检索字符串

扩展方法

方法 说明
<>.find() 搜索且只返回一个结果,同.find_all()参数
<>.find_parents() 在先辈节点中搜索,返回列表类型,同.find_all()参数
<>.find_parent() 在先辈节点中返回一个结果,同.find()参数
<>.find_next_siblings() 在后续平行节点中搜索,返回列表类型,同.find_all()参数
<>.find_next_sibling() 在后续平行节点中返回一个结果,同.find()参数
<>.find_previous_siblings() 在前序平行节点中搜索,返回列表类型,同.find_all()参数
<>.find_previous_sibling() 在前序平行节点中返回一个结果,同.find()参数

相关文章

网友评论

    本文标题:4-Beautiful Soup库的使用

    本文链接:https://www.haomeiwen.com/subject/idbhbftx.html