博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python3爬虫(六) 解析库的使用之Beautiful Soup
阅读量:5158 次
发布时间:2019-06-13

本文共 2679 字,大约阅读时间需要 8 分钟。

 Infi-chu:

 

Beautiful Soup

借助网页的结构和属性等特性来解析网页,这样就可以省去复杂的正则表达式的编写。

Beautiful Soup是Python的一个HTML或XML的解析库。

1.解析器

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

综上所述,推荐lxml HTML解析器

from bs4 import BeautifulSoupsoup = BeautifulSoup('

Hello World

','lxml')print(soup.p.string)

2.基本用法:

html = '''Infi-chu example

title example

linkelsie,lacie,tillie,last sentence

'''
from bs4 import BeautifulSoupsoup = BeautifulSoup(html,'lxml')print(soup.prettify())    # 修复htmlprint(soup.title.string)    # 输出title节点的字符串内容

3.节点选择器:

选择元素

使用soup.元素的方式获取

 

提取信息

(1)获取名称

使用soup.元素.name获取元素名称

(2)获取属性

使用soup.元素.attrs

使用soup.元素.attrs['name']

(3)元素内容

使用soup.元素.string获取内容

 

嵌套选择

使用soup.父元素.元素.string获取内容

 

关联选择

(1)子节点和子孙节点

html = '''Infi-chu example

title example

linkelsie,lacie,tillie,last sentence

'''
from bs4 import BeautifulSoup# 得到直接子节点,children属性soup = BeautifulSoup(html,'lxml')print(soup.p.children)for i ,child in enumerate(soup.p.children):    print(i,child)# 得到所有的子孙节点,descendants属性soup = BeautifulSoup(html,'lxml')print(soup.p.descendants)for i,child in enmuerate(soup.p.descendants):    print(i,child)

(2)父节点和祖先节点

调用父节点,使用parent属性

获取所有祖先节点,使用parents属性

(3)兄弟节点

next_sibling  下一个兄弟元素

previous_sibling  上一个兄弟元素

next_siblings  所有前面兄弟节点

previous_siblings  所有后面兄弟节点

(4)提取信息

 

4.方法选择器:

find_all()

find_all(name,attrs,recursize,text,**kwargs)

(1)name

soup.find_all(name='ul')for ul in soup.find_all(name='ul'):    print(ul.find_all(name='ul'))
for ul in soup.find_all(name='ul'):    print(ul.find_all(name='li'))    for li in ul.find_all(name='li'):        print(li.string)

(2)attes

# 根据节点名查询print(soup.find_all(attrs={'id':'list1'}))print(soup.find_all(attrs={'name':'elements'}))# 也可以写成print(soup.find_all(id='list1'))print(soup.find_all(class='elements'))

(3)text

text参数可以用来匹配节点的文本,传入的形式可以是字符串,可以是正则表达式对象

from bs4 import BeautifulSoupsoup = BeautifulSoup(html,'lxml')print(soup.find_all(text=re.compile('link')))

 

find()

返回一个元素

【注】

find_parents()和find_parent()

find_next_siblings()和find_next_sibling()

find_previous_siblings()和find_previous_sibling()

find_all_next()和find_next()

find_all_previous()和find_previous()

 

5.CSS选择器:

嵌套选择

for ul in soup.select('ul'):    print(ul.select('li'))

获取属性

for ul in soup.select('ul'):    print(ul['id'])    # 等价于    print(ul.attrs['id'])

获取文本

获取文本除了string属性还有get_text()方法

for li in soup.select('li'):    # 效果一样    print(li.get_text())    print(li.string)

 

转载于:https://www.cnblogs.com/Infi-chu/p/8978363.html

你可能感兴趣的文章
关于JS中&&和||用法技巧
查看>>
suoi14 子树查找 (dfs)
查看>>
作业5 四则运算 测试与封装 5.1
查看>>
实验7
查看>>
双系统更改启动顺序
查看>>
用参数较少的函数替换参数较多的函数
查看>>
[转] Java se 7新特性研究(二)
查看>>
修改电脑hosts文件
查看>>
#TS# get/set
查看>>
移动端开发模式
查看>>
Androidの高级交互之仿微信摇一摇(真心摇一摇,而不是像网传的就那么简单的震动一下)...
查看>>
Java基础知识强化之IO流笔记39:字符流缓冲流之复制文本文件案例01
查看>>
Java基础知识强化48:Java中哈希码
查看>>
TCP/IP协议原理与应用笔记24:网际协议(IP)之 IP协议的简介
查看>>
bool
查看>>
C#中Enum用法小结
查看>>
ORA-12541:TNS:无监听程序
查看>>
QMap与QHash
查看>>
Cocos2d-x动作学习笔记 分类: cocos2d代码编写 ...
查看>>
第4章例4-12 源程序2
查看>>