第三章 网页数据的解析提取之Beautiful Soup

Beautiful Soup

  • BS是python的一个XML或HTML的解析库
  • Beautiful Soup支持的解析器
    Python标准库
BeautifulSoup(markup, 'html.parser')

Python的内置标准库,执行速度适中,文档容错能力强

BeautifulSoup(markup, 'lxml')

速度快、文档容错能力强,需要安装C语言库

BeautifulSoup(markup, 'xml')

速度快、唯一支持XML的解析器,需要安装C语言库

BeautifulSoup(markup, 'html5lib')

提供最好的容错性、以浏览器的方式解析文档,生成HTML5格式的文档、速度慢,不依赖外部扩展


  • BS4的基本使用
# 使用lxml库解析,完成BS对象初始化(可以自动更新HTML格式)
soup = BeautifulSoup(html, 'lxml')
# 把要解析的字符串以标准的缩进格式输出
print(soup.prettify())
# 输出soup内容中title节点的文本内容
print(soup.title.string)
  • 节点选择器
from bs4 import BeautifulSoup

soup = BeautifulSoup(html, 'lxml')
print(soup.title)
print(type(soup.title))
print(soup.title.string)
print(soup.head)
print(soup.p)
  • 提取信息
from bs4 import BeautifulSoup

soup = BeautifulSoup(html, 'lxml')
# 获取节点名称
print(soup.title.name)
# 获取一个节点的所有属性(以字典的形式返回)
print(soup.p.attrs)
# 获取p节点属性名为name的值
print(soup.p.attrs['name'])
print(soup.p['name'])
print(soup.p['class'])
# 获取p节点的直接子节点(contents返回的是直接子节点组成的列表)
print(soup.p.contents)
# 获取p节点下的所有孩子节点(children返回的是一个生成器类型)
print(soup.p.children)
for i, child in enumerate(soup.p.children):
    print(i, child)

# 获取所有子孙节点
print(soup.p.descendants)
for i, child in enumerate(soup.p.descendants):
    print(i, child)

# 获取p节点的父亲
print(soup.p.parent)
# 获取p节点的所有祖先
print(type(soup.p.parents))
print(list(enumerate(soup.p.parents)))

# 获取下一个兄弟
print(soup.a.next_sibling)
# 获取上一个兄弟
print(soup.a.previous_sibling)
# 获取下面的兄弟
print(list(enumerate(soup.a.next_siblings)))
# 获取上面的兄弟
print(list(enumerate(soup.a.previous_siblings)))

# 获取a节点的祖先节点类型
print(type(soup.a.parents))
# 获取a节点的第一个祖先
print(list(soup.a.parents)[0])
# 获取a节点的第一个祖先的class属性
print(list(soup.a.parents)[0].attrs['class'])
  • 方法选择器

find_all:查询所有符合条件的元素

# find_all()参数说明:
"""
  find_all(name, attrs, recursive, text, **kwargs)
"""
from bs4 import BeautifulSoup
  • 使用name查找
html = """
    
"""
soup = BeautifulSoup(html, 'lxml')
# 调用find_all()方法查询所有ul节点,返回结果是列表类型,每个元素时bs4.element.Tag类型
print(soup.find_all(name='ul'))

# 再查出ul里面的li
for ul in soup.find_all(name='ul'):
    print(ul.find_all(name='li'))
    
# 遍历每一个li节点拿文本内容
for ul in soup.find_all(name='ul'):
    for li in ul.find_all(name='li'):
        print(li.string)
  • 使用attrs查找
from bs4 import BeautifulSoup

soup = BeautifulSoup(html, 'lxml')
print(soup.find_all(attrs={'id': 'list-1'}))
print(soup.find_all(attrs={'name': 'elements'}))
# 常用的也可以用下面这种方式
print(soup.find_all(id='list-1'))
print(soup.find_all(class_='elements'))
  • 使用text查找
from bs4 import BeautifulSoup

soup = BeautifulSoup(html, 'lxml')
print(soup.find_all(text=re.compile('link')))
  • 使用find查找

find():返回查找到的第一个结果
find_parents():返回所有祖先节点
find_parent():返回直接父节点
find_next_siblings():返回后面所有的兄弟节点
find_next_siblings():返回后面第一个兄弟节点
find_previous_siblings():返回前面的所有兄弟节点
find_previous_siblings():返回前面第一个兄弟节点
find_all_next():返回节点后面符合条件的所有节点
find_next():返回后面第一个符合条件的第一个节点
find_all_previous:返回节点前面所有符合条件的节点
find_previous:返回节点前面符合条件的第一个节点

你可能感兴趣的:(第三章 网页数据的解析提取之Beautiful Soup)