BeautifulSoup 模块详解
BeautifulSoup 模块详解
BeautifulSoup是一个模块,该模块用于接收一个HTML或XML字符串,然后将其进行格式化,之后遍可以使用他提供的方法进行快速查找指定元素,从而使得在HTML或XML中查找指定元素变得简单。
- from bs4 import BeautifulSoup
- html_doc = """
- <html><head><title>The Dormouse's story</title></head>
- <body>
- asdf
- <div class="title">
- <b>The Dormouse's story总共</b>
- <h1>f</h1>
- </div>
- <div class="story">Once upon a time there were three little sisters; and their names were
- <a class="sister0" id="link1">Els<span>f</span>ie</a>,
- <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
- <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
- and they lived at the bottom of a well.</div>
- ad<br/>sf
- <p class="story">...</p>
- </body>
- </html>
- """
- soup = BeautifulSoup(html_doc, features="lxml")
- # 找到第一个a标签
- tag1 = soup.find(name='a')
- # 找到所有的a标签
- tag2 = soup.find_all(name='a')
- # 找到id=link2的标签
- tag3 = soup.select('#link2')
安装
- pip3 install beautifulsoup4
使用案例
- from bs4 import BeautifulSoup
- html_doc = """
- <html><head><title>The Dormouse's story</title></head>
- <body>
- ...
- </body>
- </html>
- """
- soup = BeautifulSoup(html_doc, features="lxml")
各个属性方法介绍
name,获取标签名称
- # tag = soup.find('a')
- # name = tag.name # 获取
- # print(name)
- # tag.name = 'span' # 设置
- # print(soup)
attr,标签属性
- # tag = soup.find('a')
- # attrs = tag.attrs # 获取
- # print(attrs)
- # tag.attrs = {'ik':123} # 设置
- # tag.attrs['id'] = 'iiiii' # 设置
- # print(soup)
children,所有子标签
- # body = soup.find('body')
- # v = body.children
descendants,所有子子孙孙标签
- # body = soup.find('body')
- # v = body.descendants
clear,将标签的所有子标签全部清空(保留标签名)
- # tag = soup.find('body')
- # tag.clear()
- # print(soup)
decompose,递归的删除所有的标签
- # body = soup.find('body')
- # body.decompose()
- # print(soup)
extract,递归的删除所有的标签,并获取删除的标签
- # body = soup.find('body')
- # v = body.extract()
- # print(soup)
decode,转换为字符串(含当前标签);decode_contents(不含当前标签)
- # body = soup.find('body')
- # v = body.decode()
- # v = body.decode_contents()
- # print(v)
encode,转换为字节(含当前标签);encode_contents(不含当前标签)
- # body = soup.find('body')
- # v = body.encode()
- # v = body.encode_contents()
- # print(v)
find,获取匹配的第一个标签
- # tag = soup.find('a')
- # print(tag)
- # tag = soup.find(name='a', attrs={'class': 'sister'}, recursive=True, text='Lacie')
- # tag = soup.find(name='a', class_='sister', recursive=True, text='Lacie')
- # print(tag)
find_all,获取匹配的所有标签
- # tags = soup.find_all('a')
- # print(tags)
- # tags = soup.find_all('a',limit=1)
- # print(tags)
- # tags = soup.find_all(name='a', attrs={'class': 'sister'}, recursive=True, text='Lacie')
- # # tags = soup.find(name='a', class_='sister', recursive=True, text='Lacie')
- # print(tags)
- # ####### 列表 #######
- # v = soup.find_all(name=['a','div'])
- # print(v)
- # v = soup.find_all(class_=['sister0', 'sister'])
- # print(v)
- # v = soup.find_all(text=['Tillie'])
- # print(v, type(v[0]))
- # v = soup.find_all(id=['link1','link2'])
- # print(v)
- # v = soup.find_all(href=['link1','link2'])
- # print(v)
- # ####### 正则 #######
- import re
- # rep = re.compile('p')
- # rep = re.compile('^p')
- # v = soup.find_all(name=rep)
- # print(v)
- # rep = re.compile('sister.*')
- # v = soup.find_all(class_=rep)
- # print(v)
- # rep = re.compile('http://www.oldboy.com/static/.*')
- # v = soup.find_all(href=rep)
- # print(v)
- # ####### 方法筛选 #######
- # def func(tag):
- # return tag.has_attr('class') and tag.has_attr('id')
- # v = soup.find_all(name=func)
- # print(v)
- # ## get,获取标签属性
- # tag = soup.find('a')
- # v = tag.get('id')
- # print(v)
has_attr,检查标签是否具有该属性
- # tag = soup.find('a')
- # v = tag.has_attr('id')
- # print(v)
get_text,获取标签内部文本内容
- # tag = soup.find('a')
- # v = tag.get_text('id')
- # print(v)
index,检查标签在某标签中的索引位置
- # tag = soup.find('body')
- # v = tag.index(tag.find('div'))
- # print(v)
- # tag = soup.find('body')
- # for i,v in enumerate(tag):
- # print(i,v)
is_empty_element,是否是空标签(是否可以是空)或者自闭合标签
判断是否是如下标签:'br' , 'hr', 'input', 'img', 'meta','spacer', 'link', 'frame', 'base'
- # tag = soup.find('br')
- # v = tag.is_empty_element
- # print(v)
当前的关联标签
- # soup.next
- # soup.next_element
- # soup.next_elements
- # soup.next_sibling
- # soup.next_siblings
- #
- # tag.previous
- # tag.previous_element
- # tag.previous_elements
- # tag.previous_sibling
- # tag.previous_siblings
- #
- # tag.parent
- # tag.parents
查找某标签的关联标签
- # tag.find_next(...)
- # tag.find_all_next(...)
- # tag.find_next_sibling(...)
- # tag.find_next_siblings(...)
- # tag.find_previous(...)
- # tag.find_all_previous(...)
- # tag.find_previous_sibling(...)
- # tag.find_previous_siblings(...)
- # tag.find_parent(...)
- # tag.find_parents(...)
- # 参数同find_all
select,select_one, CSS选择器
- soup.select("title")
- soup.select("p nth-of-type(3)")
- soup.select("body a")
- soup.select("html head title")
- tag = soup.select("span,a")
- soup.select("head > title")
- soup.select("p > a")
- soup.select("p > a:nth-of-type(2)")
- soup.select("p > #link1")
- soup.select("body > a")
- soup.select("#link1 ~ .sister")
- soup.select("#link1 + .sister")
- soup.select(".sister")
- soup.select("[class~=sister]")
- soup.select("#link1")
- soup.select("a#link2")
- soup.select('a[href]')
- soup.select('a[href="http://example.com/elsie"]')
- soup.select('a[href^="http://example.com/"]')
- soup.select('a[href$="tillie"]')
- soup.select('a[href*=".com/el"]')
- from bs4.element import Tag
- def default_candidate_generator(tag):
- for child in tag.descendants:
- if not isinstance(child, Tag):
- continue
- if not child.has_attr('href'):
- continue
- yield child
- tags = soup.find('body').select("a", _candidate_generator=default_candidate_generator)
- print(type(tags), tags)
- from bs4.element import Tag
- def default_candidate_generator(tag):
- for child in tag.descendants:
- if not isinstance(child, Tag):
- continue
- if not child.has_attr('href'):
- continue
- yield child
- tags = soup.find('body').select("a", _candidate_generator=default_candidate_generator, limit=1)
- print(type(tags), tags)
标签的内容
- # tag = soup.find('span')
- # print(tag.string) # 获取
- # tag.string = 'new content' # 设置
- # print(soup)
- # tag = soup.find('body')
- # print(tag.string)
- # tag.string = 'xxx'
- # print(soup)
- # tag = soup.find('body')
- # v = tag.stripped_strings # 递归内部获取所有标签的文本
- # print(v)
append 在当前标签内部追加一个标签
- # tag = soup.find('body')
- # tag.append(soup.find('a'))
- # print(soup)
- #
- # from bs4.element import Tag
- # obj = Tag(name='i',attrs={'id': 'it'})
- # obj.string = '我是一个新来的'
- # tag = soup.find('body')
- # tag.append(obj)
- # print(soup)
insert 在当前标签内部指定位置插入一个标签
- # from bs4.element import Tag
- # obj = Tag(name='i', attrs={'id': 'it'})
- # obj.string = '我是一个新来的'
- # tag = soup.find('body')
- # tag.insert(2, obj)
- # print(soup)
insert_after,insert_before 在当前标签后面或前面插入
- # from bs4.element import Tag
- # obj = Tag(name='i', attrs={'id': 'it'})
- # obj.string = '我是一个新来的'
- # tag = soup.find('body')
- # # tag.insert_before(obj)
- # tag.insert_after(obj)
- # print(soup)
replace_with 在当前标签替换为指定标签
- # from bs4.element import Tag
- # obj = Tag(name='i', attrs={'id': 'it'})
- # obj.string = '我是一个新来的'
- # tag = soup.find('div')
- # tag.replace_with(obj)
- # print(soup)
创建标签之间的关系
- # tag = soup.find('div')
- # a = soup.find('a')
- # tag.setup(previous_sibling=a)
- # print(tag.previous_sibling)
wrap,将指定标签把当前标签包裹起来
- # from bs4.element import Tag
- # obj1 = Tag(name='div', attrs={'id': 'it'})
- # obj1.string = '我是一个新来的'
- #
- # tag = soup.find('a')
- # v = tag.wrap(obj1)
- # print(soup)
- # tag = soup.find('a')
- # v = tag.wrap(soup.find('p'))
- # print(soup)
unwrap,去掉当前标签,将保留其包裹的标签
- # tag = soup.find('a')
- # v = tag.unwrap()
- # print(soup)
更多参数官方:http://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/
本博文参考自:http://www.cnblogs.com/wupeiqi/articles/6283017.html
BeautifulSoup 模块详解的更多相关文章
- Python中操作mysql的pymysql模块详解
Python中操作mysql的pymysql模块详解 前言 pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同.但目前pymysql支持python3.x而后者不支持 ...
- python之OS模块详解
python之OS模块详解 ^_^,步入第二个模块世界----->OS 常见函数列表 os.sep:取代操作系统特定的路径分隔符 os.name:指示你正在使用的工作平台.比如对于Windows ...
- python之sys模块详解
python之sys模块详解 sys模块功能多,我们这里介绍一些比较实用的功能,相信你会喜欢的,和我一起走进python的模块吧! sys模块的常见函数列表 sys.argv: 实现从程序外部向程序传 ...
- python中threading模块详解(一)
python中threading模块详解(一) 来源 http://blog.chinaunix.net/uid-27571599-id-3484048.html threading提供了一个比thr ...
- python time 模块详解
Python中time模块详解 发表于2011年5月5日 12:58 a.m. 位于分类我爱Python 在平常的代码中,我们常常需要与时间打交道.在Python中,与时间处理有关的模块就包括: ...
- python time模块详解
python time模块详解 转自:http://blog.csdn.net/kiki113/article/details/4033017 python 的内嵌time模板翻译及说明 一.简介 ...
- 小白的Python之路 day5 time,datatime模块详解
一.模块的分类 可以分成三大类: 1.标准库 2.开源模块 3.自定义模块 二.标准库模块详解 1.time与datetime 在Python中,通常有这几种方式来表示时间:1)时间戳 2)格式化的时 ...
- 小白的Python之路 day5 random模块和string模块详解
random模块详解 一.概述 首先我们看到这个单词是随机的意思,他在python中的主要用于一些随机数,或者需要写一些随机数的代码,下面我们就来整理他的一些用法 二.常用方法 1. random.r ...
- Python中time模块详解
Python中time模块详解 在平常的代码中,我们常常需要与时间打交道.在Python中,与时间处理有关的模块就包括:time,datetime以及calendar.这篇文章,主要讲解time模块. ...
随机推荐
- conda常用命令
1. conda基本命令 检查Anaconda是否成功安装 conda --version 检测目前安装了哪些环境 conda info --envs 检查目前有哪些版本的python可以安装: co ...
- Express web框架
哈哈,还是Node.JS哦 现在我们来看看位Node.JS些的Express webkuangjia 一. 安装express npm install express -g --save npm in ...
- import Tkinter error, no module named tkinter: "Python may not be configured for Tk”
install required devel module in your linux: yum install tk-devel yum install tcl-devel then,reconfi ...
- c++基础:之封装
原创: 零灵柒 C/C++的编程教室 2月4日 什么是类 C++是什么?C++设计之初就是class with c,所以简单点说,C++就是带类的C,那么什么是类? 类,简单点说就是类型,在 ...
- PO模型
大神绕道而行,自我小白的笔记,仅此 一.创建文件夹,创建xxx.ini文件用来存放界面的定位元素,用 [界面_element]-->界面, 来划分界面界面元素,维护方便.定位元素的格式: us ...
- gitlab数据迁移至其他gitlb服务器上
需求: A : 待迁移服务器,上边存有数据 B:接收项目得服务器,本身存在数据 验证方案: 一,搭建gitlab8.15.2 OS:rhel7.4 yum install policycoreutil ...
- hadoop 遇到java.net.ConnectException: to 0.0.0.0:10020 failed on connection
hadoop 遇到java.net.ConnectException: to 0.0.0.0:10020 failed on connection 这个问题一般是在hadoop2.x版本里会出 ...
- UVa-116 Unidirectional TSP 单向旅行商
题目 https://vjudge.net/problem/uva-116 分析 设d[i][j]为从(i,j)到最后一列的最小开销,则d[i][j]=a[i][j]+max(d[i+1][j+1], ...
- MOG插件(葡萄牙语,略作翻译)
这次记录下MOG大神的插件,自从我发现了这个插件,似乎开启了一个新世界诶~~~ 网址 https://atelierrgss.wordpress.com 1. MOG_YuruYuri.js CARA ...
- C语言阐述进程和线程的区别
[cpp]view plain copy /* 每一个程序相当于一个进程,而一个进程之中可以有多个线程 */ #define _CRT_SECURE_NO_WARNINGS #include<s ...