创建并显示原始内容

其中的lxml第三方解释器加快解析速度

import bs4
from bs4 import BeautifulSoup
html_str = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title"><b>The Dormouse's story</b></p>
<p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1"><!-- Elsie --></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.</p>
<p class="story">...</p>
"""
soup = BeautifulSoup(html_str,'lxml')
print(soup.prettify())

控制台显示出soup需要处理的内容:

提取对象内容和属性

搜索包括了所有的标签。默认提取第一个符合条件的标签。

提取Tag对象

其中,name用于显示标签名,去掉name则内容直接显示。

print(soup.name)
print(soup.title.name)
print(soup.title)
print(soup.a)

控制台输出效果如下:

显示属性

attrs用于显示属性。class用于显示选中的标签Tag中的类名。

print(soup.p['class'])
print(soup.p.attrs)

输出结果:

内容文字

显示标记中的文字,NavigableString类型

print(soup.p.string)
print(type(soup.p.string))

效果:

显示注释

显示注释内容,注意与普通string的区别在于最后的类,用于数据分类

print(soup.a.string)
print(type(soup.a.string))

文档相关结点

直接子节点数组

结点中的contents输出直接子节点数组,可以通过for逐个输出,通过string属性直接输出内容

print(soup.body.contents)

输出body标签下的直接子节点:

结点children输出直接子节点,和contents类似。不一样的是返回了生成器,一点参考:https://www.cnblogs.com/wj-1314/p/8490822.html

for i in soup.body.children:print(i,end='')

添加了end=''用于去掉print的自动换行

子、孙节点

结点descendants可以输出子节点和孙节点

for i in soup.body.descendants:print(i)

效果:

节点strings输出全部子节点内容值

print(soup.strings)print('------------------------')
for text in soup.strings:print(text,end='')

效果:

节点stripped_strings输出全部内容并去掉回车和空格

for text in soup.stripped_strings:print(text)

print每次输出加上换行后,效果:

父节点相关

父节点parent

print(soup.title)
print(soup.title.parent)

效果:

父辈节点parents,这里只输出名字就好了,否则内容过多

for i in soup.a.parents:print(i.name)

效果:

兄弟节点等

兄弟节点next_sibling,previous_sibling,另有 :next_siblings,previous_siblings

print(soup.p.next_sibling.next_sibling)
print(soup.p.previous_sibling)

效果:

前后节点:next_element,next_elements等......

BeautifulSoup的搜索方法

包括了find_all,find,find_parents等等,这里只举例find_all。

find_all中参数name查找名称标记

查找所有b标签

print(soup.find_all('b'))

输出:

查找所有b开头的标签

配合正则表达式使用

import re
for tag in soup.find_all(re.compile("^b")):print(tag.name)

输出:

查找a开头和b开头的标签

print(soup.find_all(["a", "b"]))

输出:(一个数组,过长)

查找所有标签,True可以匹配任何值

for tag in soup.find_all(True):print(tag.name)

输出:

自定义过滤

查找含有class和id属性的Tag标签

def hasClass_Id(tag):return tag.has_attr('class') and tag.has_attr('id')
print(soup.find_all(hasClass_Id))

效果:

查找关键词参数kwargs并输出

查找id参数为link2的标签

print(soup.find_all(id='link2'))

输出:

查找链接中含有elsie的标签

配合正则表达式

print(soup.find_all(href=re.compile("elsie")))

输出:

查找所有有id属性的标签

print(soup.find_all(id=True))

输出:

查找所有a标签且class内容为sister

print(soup.find_all("a", class_="sister"))

输出:

查找所有链接含有elsie的标签,id为link1

print(soup.find_all(href=re.compile("elsie"), id='link1'))

输出:

不能表达的属性的解决方案

在html5中有些属性不被支持,查找时,通过定义字典实现输出

data_soup = BeautifulSoup('<div data-foo="value">foo!</div>','lxml')
print(data_soup.find_all(attrs={"data-foo": "value"}))

输出:

通过text参数查找文本内容并过滤

输入:

print(soup.find_all(text=["Tillie", "Elsie", "Lacie"]))
print(soup.find_all(text=re.compile("Dormouse")))

输出:

通过limit参数限制查找数量

输入:

print(soup.find_all("a", limit=2))

输出只有两个:

通过recursive参数只查找直接子节点

soup位于根处

print(soup.find_all("title"))
print(soup.find_all("title", recursive=False))

输出:

使用CSS选择器查找

#直接查找title标签
print soup.select("title")
#逐层查找title标签
print soup.select("html head title")
#查找直接子节点
#查找head下的title标签
print soup.select("head > title")
#查找p下的id="link1"的标签
print soup.select("p > #link1")
#查找兄弟节点
#查找id="link1"之后class=sisiter的所有兄弟标签
print soup.select("#link1 ~ .sister")
#查找紧跟着id="link1"之后class=sisiter的子标签
print soup.select("#link1 + .sister")print soup.select(".sister")
print soup.select("[class~=sister]")print soup.select("#link1")
print soup.select("a#link2")print soup.select('a[href]')print soup.select('a[href="http://example.com/elsie"]')
print soup.select('a[href^="http://example.com/"]')
print soup.select('a[href$="tillie"]')
print soup.select('a[href*=".com/el"]')

输出:

转载于:https://www.cnblogs.com/bai2018/p/10964702.html

python网络爬虫(5)BeautifulSoup的使用示范相关推荐

  1. Python网络爬虫使用BeautifulSoup爬取网页内容并存入数据库案例

    使用BeautifulSoup爬取网页内容并存入数据库案例 学习了Python网络爬虫,完成里一个比较完整的爬虫案例与大家分享 爬取地址:http://www.tipdm.com/cpzx/index ...

  2. 爬虫书籍-Python网络爬虫权威指南OCR库 NLTK 数据清洗 BeautifulSoup Lambda表达式 Scrapy 马尔可夫模型

    Python网络爬虫权威指南 编辑推荐 适读人群 :需要抓取Web 数据的相关软件开发人员和研究人员 作为一种采集和理解网络上海量信息的方式,网页抓取技术变得越来越重要.而编写简单的自动化程序(网络爬 ...

  3. Python网络爬虫--BeautifulSoup库的基本元素

    requests requests库可以看看这篇文章 http://blog.csdn.net/shanzhizi/article/details/50903748 最近在学习嵩天老师的Python网 ...

  4. [Python从零到壹] 五.网络爬虫之BeautifulSoup基础语法万字详解

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  5. python网络爬虫_Python网络爬虫——爬取视频网站源视频!

    原标题:Python网络爬虫--爬取视频网站源视频! 学习前提 1.了解python基础语法 2.了解re.selenium.BeautifulSoup.os.requests等python第三方库 ...

  6. python网络爬虫权威指南 百度云-分析《Python网络爬虫权威指南第2版》PDF及代码...

    对那些没有学过编程的人来说,计算机编程看着就像变魔术.如果编程是魔术(magic),那么网页抓取(Web scraping)就是巫术(wizardry),也就是运用"魔术"来实现精 ...

  7. 精通python网络爬虫-精通Python网络爬虫 PDF 高清版

    给大家带来的一篇关于Python爬虫相关的电子书资源,介绍了关于Python.网络爬虫.核心技术.框架.项目实战方面的内容,本书是由机械工业出版社出版,格式为PDF,资源大小108.6 MB,韦玮编写 ...

  8. 精通python网络爬虫-精通Python网络爬虫:核心技术、框架与项目实战 PDF

    给大家带来的一篇关于Python爬虫相关的电子书资源,介绍了关于Python.Python网络爬虫.Python核心技术.Python框架.Python项目实战方面的内容,本书是由机械工业出版社出版, ...

  9. python网络爬虫的基本步骤-详解Python网络爬虫功能的基本写法

    网络爬虫,即Web Spider,是一个很形象的名字.把互联网比喻成一个蜘蛛网,那么Spider就是在网上爬来爬去的蜘蛛. 1. 网络爬虫的定义 网络蜘蛛是通过网页的链接地址来寻找网页的.从网站某一个 ...

  10. python网络爬虫的基本步骤-python爬虫入门需要哪些基础/python 网络爬虫教程

    如何入门 Python 爬虫 入门个吊,放弃 python爬虫入门需要哪些基础 现在之所以有多的小伙伴热衷于爬虫技术,无外乎是因为爬我们做很多事情,比如搜索引擎.采集数据.广告过滤等,以Python为 ...

最新文章

  1. struts2+hibernate-jpa+Spring+maven 整合(1)
  2. (HDU)1056 --HangOver( 悬住)
  3. 深度学习(二十二)Dropout浅层理解
  4. log4cplus导致主进程不能退出问题解决
  5. 9.linux ntp服务器搭建
  6. 一键安装lamp环境 centos
  7. 国企公司java面试题_整理最全的Java笔试题库之问答题篇-国企笔试题库
  8. 地图标注不完整图片_“地图帝”不规范使用图件之Anton Balazh作品介绍
  9. Polarion软件下载安装使用试用
  10. Android内存分析工具
  11. 神经网络matlab 验证集,机器学习中训练集、验证集、测试集的定义和作用
  12. 小程序12306服务器,微信小程序12306来了!史上最详细体验出炉!
  13. uac管理员程序_有启用UAC的管理员快速打开程序的方法吗?
  14. Windows安装Gitea
  15. Python socket文件上传下载
  16. 微信小程序如何让storage过期
  17. Tableau阈值设置及其使用
  18. Python中的命名元组(namedtuple)到底是什么东西?干嘛用的?
  19. 树莓派编译ffmpeg支持x264硬解码播放视频
  20. 注册中心Consul

热门文章

  1. 数据结构与算法 —— 链表linked list(01)
  2. SSKeychain
  3. ubuntu下安装配置nfs
  4. MySQL运算符优先级顺序
  5. 团队开发框架(Developement Structure for Team),内容列表及整理计划
  6. 位置指纹法的实现(KNN)
  7. xcode 4 最低的要求是 10.6.6的版本,如果你是 10.6.3的版本,又不想升级的话。可以考虑通过修改版本号的方法进行安装
  8. Intent.ACTION_MAIN
  9. 区块链101:区块链的应用和用例是什么?
  10. 当javaScript从入门到提高前需要注意的细节:变量部分