beautifulSoup常用方法

Beautiful Soup 将复杂 HTML 文档转换成一个复杂的树形结构,每个节点都是 Python 对象,所有对象可以归纳为 4 种: Tag、NavigableString、BeautifulSoup、Comment,Attribute 。

Tag通俗点讲就是 HTML 中的一个个标签。

NavigableString:获取标签内部的文字,如,soup.p.string

BeautifulSoup:表示一个文档的全部内容。大部分时候,可以把它当作 Tag 对象,是一个特殊的 Tag。

Comment:Comment 对象是一个特殊类型的 NavigableString 对象,其输出的内容不包括注释符号,但是如果不好好处理它,可能会对我们的文本处理造成意想不到的麻烦。

装载BeautifulSoup

from bs4 import BeautifulSoup
import requests

url = 'http://python123.io/ws/demo.html'
r = requests.get(url)
demo = r.text  # 服务器返回响应

soup = BeautifulSoup(demo, "html.parser")
"""
demo 表示被解析的html格式的内容
html.parser表示解析用的解析器
"""
print(soup)  # 输出响应的html对象

输出结果

  

 

print(soup.title)  # 获取html的title标签的信息
print(soup.a)  # 获取html的a标签的信息(soup.a默认获取第一个a标签,想获取全部就用for循环去遍历)
print(soup.a.name)   # 获取a标签的名字
print(soup.a.parent.name)   # a标签的父标签(上一级标签)的名字
print(soup.a.parent.parent.name)  # a标签的父标签的父标签的名字

输出结果

  <title>This is a python demo page</title>
  <a class="py1" href="http://www.icourse163.org/course/BIT-268001" id="link1">Basic Python</a>
  a
  p
  body

 

 

print('a标签类型是:', type(soup.a))   # 查看a标签的类型
print('第一个a标签的属性是:', soup.a.attrs)  # 获取a标签的所有属性(注意到格式是字典)
print('a标签属性的类型是:', type(soup.a.attrs))  # 查看a标签属性的类型
print('a标签的class属性是:', soup.a.attrs['class'])   # 因为是字典,通过字典的方式获取a标签的class属性
print('a标签的href属性是:', soup.a.attrs['href'])   # 同样,通过字典的方式获取a标签的href属性

输出结果

  a标签类型是: <class 'bs4.element.Tag'>
  第一个a标签的属性是: {'href': 'http://www.icourse163.org/course/BIT-268001', 'class': ['py1'], 'id': 'link1'}
  a标签属性的类型是: <class 'dict'>
  a标签的class属性是: ['py1']
  a标签的href属性是: http://www.icourse163.org/course/BIT-268001

BeautifulSoup的提供了两个超级好用的方法(可能是你用bs方法中最常用的)。借助这两个函数,你可以通过表现的不同属性轻松过滤HTML(XML)文件,查找需要的标签组或单个标签。

find()找到第一个满足条件的标签就返回,不在继续往下寻找。

findAll()找到所有满足条件的标签以列表形返回。

print(soup.find('a'))#找寻a标签第一次出现的位置

结果
<a class="py1" href="http://www.icourse163.org/course/BIT-268001" id="link1">Basic Python</a>

  

常用通过find_all()方法来查找标签元素:<>.find_all(nameattrsrecursivestring**kwargs) ,返回一个列表类型,存储查找的结果 

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

 for i in soup.find_all('a'):
  print('标签名称:', i)

结果为

标签名称: <a class="py1" href="http://www.icourse163.org/course/BIT-268001" id="link1">Basic Python</a>
标签名称: <a class="py2" href="http://www.icourse163.org/course/BIT-1001870001" id="link2">Advanced Python</a>

 

 for i in soup.find_all('a',{'class':{'py1'}}): #找寻a标签当中class为py1的html标签
  print(i)

结果为

标签名称: <a class="py1" href="http://www.icourse163.org/course/BIT-268001" id="link1">Basic Python</a>

  

posted @ 2019-11-24 10:25  Crush999  阅读(1488)  评论(0编辑  收藏  举报