6. BeautifulSoup 解析库

2018-08-31  本文已影响0人  柄志

BeautifulSoup 解析库

BeautifulSoup 解析库根据HTML和XML语法建立解析树,进而高效解析其中的内容。

:\>pip install beaytifulsoup4

解析器

BeautifulSoup支持的解析器

解析器 使用方法 优势 劣势
Python标准库 BeautifulSoup(markup,'html.parser') Python内置标准库,执行速度适中、文档容错能力强 Python2.7.3及3.2.2之前的版本文档容错能力差
lxml HTML 解析器 BeautifulSoup(markup,'lxml') 速度快、文档容错能力强 需要安装C语言库
lxml XML 解析器 BeautifulSoup(markup,'xml') 速度快、唯一支持XML的解析器 需要安装C语言库
html5lib BeautifulSoup(markup,'html5lib') 最后的容错性、以浏览器的方式解析文档、生成HTML5格式的文档 速度慢、不依赖外部扩展

基本用法

实例文档

<html>
<head>
<title>The Dormouse's story</title>
</head>

<body>
<p class="title" name="dromouse"><b>The Dormouse's story</b></p>
<p class="story">Once upon a time there were three little sisters; and their names were
<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a> and
<a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>
<p class="story">...</p>
from bs4 import BeautifulSoup

soup = BeautifulSoup(html,'lxml')  #  BeautifulSoup对象初始化
print(soup.prettify)  # 标准的缩进格式输出待解析字符串

BeautifulSoup对象的常用属性

属性 描述
head HTML页面的<head>内容
title HTML页面的标题,在<head>中,由<title>标记
body HTML页面<body>内容
p HTML页面中第一个<p>中的内容
strings HTML页面所有呈现在Web上的字符串,即标签的内容
stripped_strings HTML页面所有呈现在Web上的非空格字符串

节点选择器

选择元素

from bs4 import BeautifulSoup

soup = BeautifulSoup(html,'lxml')

print(type(soup.title))  # <class 'bs4.element.Tag'>
print(soup.title)  # 返回节点加其内部的所有内容
print(soup.p)  # 有多个节点时,只选择匹配到的第一个节点

提取信息

节点对象的属性

属性 描述
name 节点的名字,字符串类型
attrs 节点的属性,字典类型
string 节点的内容,字符串类型
from bs4 import BeautifulSoup

soup = BeautifulSoup(html,'lxml')

print(soup.title.name)  # 调用name属性获取节点的名称

print(soup.p.attrs)  # 调用attrs属性获取节点所有属性,返回字典类型
print(soup.p.attrs['name'])  # 中括号加属性名获取某个属性
print(soup.p['name'])  # 获取某个属性的简写方法

print(soup.title.string)  # 调用string属性获取节点元素包含的文本内容

嵌套选择

from bs4 import BeautifulSoup

soup = BeautifulSoup(html,'lxml')

print(type(soup.head))  # <class 'bs4.element.Tag'>
print(type(soup.head.title))  # <class 'bs4.element.Tag'>

关联选择

子节点和子孙节点

from bs4 import BeautifulSoup

soup = BeautifulSoup(html,'lxml')

print(type(soup.p.contents))  # <class 'list'>
print(type(soup.p.children))  # <class 'list_iterator'>
print(type(soup.p.descendants))  # <class 'generator'>

for i,child in enumerate(soup.p.descendants):  # 遍历输出
    print(i,child)

父节点和祖先节点

from bs4 import BeautifulSoup

soup = BeautifulSoup(html,'lxml')

print(type(soup.a.parent))  # <class 'list_iterator'>
print(type(soup.a.parents))  # <class 'generator'>

print(list(enumerata(soup.a.parents)))  # 列表输出索引和内容

兄弟节点

from bs4 import BeautifulSoup

soup = BeautifulSoup(html,'lxml')

print(soup.a.next_sibling)
print(soup.a.previous_siblings)

提取信息

from bs4 import BeautifulSoup

soup = BeautifulSoup(html,'lxml')

print(soup.a.next_sibling。string)
print(list(soup.a.parent)[0].string)
print(list(soup.a.parents)[0].attrs['class'])

方法选择器

find_all()

name

from bs4 import BeautifulSoup

soup = BeautifulSoup(html,'lxml')

print(soup.find_all(name='a'))

attrs

from bs4 import BeautifulSoup

soup = BeautifulSoup(html,'lxml')

print(soup.find_all(attrs={'name':'dromouse'}))
print(soup.find_all(id='link1'))
print(soup.find_all(class_='sister'))  # class是Python关键字,为避免冲突需要在class属性后加下划线

text

import re
from bs4 import BeautifulSoup

soup = BeautifulSoup(html,'lxml')

print(soup.find_all(text='The Dormouse\'s story'))
print(soup.find_all(text=re.compile('Once')))

find()

其他查询方法

CSS选择器

上一篇下一篇

猜你喜欢

热点阅读