一、BS4

1.1、前沿

BeautifulSoup 是一个可以从HTML或XML文件中提取数据的Python库,它的使用方式相对于正则来说更加的简单方便,常常能够节省我们大量的时间。(我这里只是简单介绍bs4使用,想了解更多的小伙伴可以参考:官方中文文档)

安装

pip install beautifulsoup4

解析器

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

由于这个解析的过程在大规模的爬取中是会影响到整个爬虫系统的速度的,所以推荐使用的是lxml,速度会快很多,而lxml需要单独安装:pip install lxml

提示:如果一段HTML或XML文档格式不正确的话,那么在不同的解析器中返回的结果可能是不一样的,所以要指定某一个解析器。

基本语法

(往下的示例均以下面的这个HTML代码作为案例)
html_str="""<!DOCTYPE html>
<html>
<head>
<title>爬虫</title><meta charset="utf-8"><link rel="stylesheet" href="http://www.taobao.com"><link rel="stylesheet" href="https://www.baidu.com"><link rel="stylesheet" href="http://at.alicdn.com/t/font_684044_un7umbuwwfp.css">
</head>
<body>
<!-- footer start -->
<footer id="footer"><div class="footer-box"><div class="footer-content"  ><p class="top-content"  id="111"><a  href="http://www.taobao.com">淘宝</a> <span class="link"><a class="product"  href="https://www.baidu.com">关于Python</a> <a  href="http://www.taobao.com">好好学习</a> <a href="javascript:void(0)">人生苦短</a> <a href="javascript:void(0)">我用Python</a></span><span class="about-me">关于我: <i class="PyWhich py-wechat"></i> 忽略</span></p><p class="bottom-content"><span>地址: xxxx</span><span>联系方式: <a href="tel:400-1567-315">400-1567-315</a> (24小时在线)</span></p></div><p class="copyright-desc">Copyright &copy; 爬虫有限公司. All Rights Reserved</p></div>
</footer></body>
</html>
"""
from bs4  import BeautifulSoup#导包
soup=BeautifulSoup(html_str,'lxml') #html_str:HTML代码
type(soup)  #结果:bs4.BeautifulSoup

1.2、获取标签

格式:soup.标签 (注意这里的soup是上面初始化的)

示例:

soup.a  #获取第一个符合条件的标签
#结果: <a href="http://www.taobao.com">淘宝</a>

1.3、获取标属性

格式:soup.标签['属性名']
示例:

soup.a['href']
#结果:'http://www.taobao.com'

1.4、获取内容

格式:soup.标签.text
示例:

soup.a.text
#结果:'淘宝'

1.5、亲戚标签的选择

(有兴趣的自己去运行下,我这里就不运行了)
示例:

body=soup.bodylist(body.children)#获取 儿子标签 仅仅是儿子 body.children迭代器body.contents#获取 儿子元素  到列表中body.descendants  #获取所有的后代元素标签    生成器(转成list可以打印结果)p=body.p #获取第一个符合条件的p标签p.next_sibling.next_sibling#获取下一个兄弟元素body.previous_sibling.previous_sibling#获取上一个兄弟元素p_parents=p.parents #获取所有的父辈元素  生成器

1.6、find_all

def find_all(name=None, attrs={}, recursive=True, text=None):#作用:查找元素  返回值是存储在列表中#name  标签名字#attrs  属性#recursive  递归  只能获取到 子元素#text    标签内容pass

示例:

a=soup.find_all("a",text="淘宝")#根据标签名查找所有元素    标签内容 筛选定位元素
print(a) #结果: [<a href="http://www.taobao.com">淘宝</a>]
p=soup.find_all("p",attrs={"class":"top-content"})#名字 属性定位 元素
html=soup.find_all("html",recursive=False)#只获取子元素

1.7、CSS选择器

示例:

soup.select("p") #根据名字获取所有元素soup.select("p > span")  #获取所有p标签下 所有的子代span元素
soup.select("p span")  #获取所有p标签下 所有的span元素
soup.select('.top-content') #获取class为top-content的元素
soup.select('#111')  #获取id为111 的元素

二、Xpath

基本语法

from  lxml  import  etree  #导包
page=etree.HTML(html_str)  #结果:<Element html at 0x27ed6712cc8>

2.1、标签选择与属性值的选择

示例:

page.xpath('/html/body')  #从根路径开始,层层筛选  /:表示下一级的元素
#结果:[<Element body at 0x163035a6b80>]p=page.xpath("//p") #获取所有p标签元素  存在列表中
p[0].xpath('./a') #  . : 表示当前元素标签
#结果:[<Element a at 0x1630358ff00>]a=page.xpath("//a")[0]
a.xpath('..')  #..  :当前节点的父节点page.xpath("body")#根据标签名字 获取元素  只能拿到子标签
#[<Element body at 0x163035a6b80>]
p=page.xpath('//p[@class="top-content"]')#根据属性获取标签
#[<Element p at 0x27ed684a948>]attr_value=page.xpath('//p[@class="bottom-content"]/span') #获取标签属性值
# [<Element span at 0x16303589dc0>, <Element span at 0x16303596640>]page.xpath("//*") #获取所有标签元素tags=page.xpath('//p[@class="top-content"]/a[1]')  #xpath 规则  从1开始
#[<Element a at 0x27ed6712f08>]

2.2、获取文本

示例:

contents=page.xpath("//p/a/text()") #获取标签内容  在列表中
# ['淘宝', '关于Python', '好好学习', '人生苦短', '我用Python', '优秀']con_all=page.xpath("string(//html)")#获取标签下所有内容

2.3、语法总结

  • 常用

XPath 使用路径表达式在 XML/HTML 文档中选取节点。节点是通过沿着路径或者 step 来选取的。

下面列出了最有用的路径表达式:

表达式 描述
nodename 选取当前节点的所有nodename子节点
/ 从根节点选取
// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
. 选取当前节点
.. 选取当前节点的父节点
@ 选取属性
  • 谓语

谓语用来查找某个或某些特定的节点或者包含某个指定值的节点谓语被嵌在方括号中。

实例:
在下面的表格中,我们列出了带有谓语的一些路径表达式,以及表达式的结果。

路径表达式 结果
//bookstore/book[1] 选取属于 bookstore 子元素的第一个 book 元素。
//bookstore/book[last()] 选取属于 bookstore 子元素的最后一个 book 元素。
//bookstore/book[last()-1] 选取属于 bookstore 子元素的倒数第二个 book 元素。
//bookstore/book[position() < 3] 选取最前面的两个属于 bookstore 元素的子元素的 book 元素。
//title[@lang] 选取所有拥有名为 lang 的属性的 title 元素。
//title[@lang=‘eng’] 选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。
//bookstore/book[price>35.00] 选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00。
//bookstore/book[price>35.00]/title 选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00。
  • Xpath通配符,选取未知节点
通配 描述 路径表达式 结果
* 匹配任何元素节点 //bookstore/* 选取bookstore元素的所有子元素。
@* 匹配任何属性节点 //* 选取文档中国的所有元素
node() 匹配任何类型的节点 //title[@*] 选取所有带有属性的title元素

三、小案例:TOP250电影信息(首页)

3.1、requests + bs4

import requests
from bs4 import BeautifulSoupurl = 'https://movie.douban.com/top250'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.101 Safari/537.36 Edg/91.0.864.48'}
res = requests.get(url,headers=headers)soup = BeautifulSoup(res.text,'lxml')boxs = soup.select('.info')
for box in boxs:film_name = box.select('.hd a .title')[0].textprint('电影名称:', film_name, end=' ')score = box.select('.bd .star .rating_num')[0].textprint('评分:', score, end=' ')director = box.select('.bd p')[0].text.strip().split('\n')[0]print('导演:', director)

结果:


3.2、requests + xpath

import requests
from lxml import etreeurl = 'https://movie.douban.com/top250'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.101 Safari/537.36 Edg/91.0.864.48'}res = requests.get(url,headers=headers)html = etree.HTML(res.text)
boxs = html.xpath('//div[@class="info"]')for box in boxs:film_name = box.xpath('./div/a/span[1]/text()')[0]print('电影名称:', film_name, end=' ')score = box.xpath('./div/div/span[2]/text()')[0]print('评分:', score, end=' ')director = box.xpath('./div/p/text()')[0].strip()print('导演:', director)

结果:

爬虫学习笔记(五)——网页解析工具(bs4、xpath)相关推荐

  1. Python3 爬虫学习笔记 C08【解析库 Beautiful Soup】

    Python3 爬虫学习笔记第八章 -- [解析库 Beautiful Soup] 文章目录 [8.1]关于 Beautiful Soup [8.2]Beautiful Soup 的基本使用 [8.3 ...

  2. Python3 爬虫学习笔记 C04 【自动化测试工具 Selenium】

    Python3 爬虫学习笔记第四章 -- [自动化测试工具 Selenium] 文章目录 [4.1]下载驱动 [4.2]声明浏览器对象 [4.3]访问页面 [4.4]启动参数 [4.5]查找节点 [4 ...

  3. Python3 爬虫学习笔记 C07 【解析库 lxml】

    Python3 爬虫学习笔记第七章 -- [解析库 lxml] 文章目录 [7.1]关于 lxml [7.2]使用 XPath [7.3]查找所有节点 [7.4]查找子节点 [7.5]查找父节点 [7 ...

  4. Python爬虫学习笔记 (2) [初级] 初识 requests + bs4 + re

    更新日期:2021.03.12 本节学习内容 爬取网页(第一页)的源代码:初步了解 requests 的使用. 解析代码:初步了解 BeautifulSoup (bs4) 和 re 的使用. 保存信息 ...

  5. python自带网页解析器_Python爬虫Chrome网页解析工具-XPath Helper

    之前就说过Python爬虫中Xpath的用法,相信每一个写爬虫.或者是做网页分析的人,都会因为在定位.获取XPath路径上花费大量的时间,在没有这些辅助工具的日子里,我们只能通过搜索HTML源代码,定 ...

  6. python爬虫学习笔记 1.9 (Handler处理器 和 自定义Opener)

    python爬虫学习笔记 1.1(通用爬虫和聚焦爬虫) python爬虫学习笔记 1.2 ( HTTP和HTTPS ) python爬虫学习笔记 1.3 str和bytes的区别 python爬虫学习 ...

  7. Python3 爬虫学习笔记 C09【数据储存系列 — 文件储存】

    Python3 爬虫学习笔记第九章 -- [数据储存系列 - 文件储存] 文章目录 [9.1]TXT 文本存储 [9.1.1]基本示例 [9.1.2]打开方式 [9.2]JSON 文件存储 [9.2. ...

  8. python网络爬虫学习笔记(6)动态网页抓取(一)知识

    文章目录 网络爬虫学习笔记(2) 1 资料 2 笔记 2-1 动态抓取概述 2-2 通过浏览器审查元素解析真实网页地址 2-3 网页URL地址的规律 2-4 json库 2-5 通过Selenium模 ...

  9. 爬虫学习笔记(五)——VMGIRLS唯美小姐姐的图片不让爬了,怎么办?

    系列文章目录 <font color=#999AAA 爬虫学习笔记(四)--糗百爬虫遇到的反爬 爬虫学习笔记(三)--利用JSON爬取豆瓣热映的使用 爬虫学习笔记(二):requests基础用法 ...

最新文章

  1. 怎么用python判断数据是否已经存在于表里_数据基本操作(二)
  2. ASP.NET MVC 5 入门教程 (2) 控制器Controller
  3. 免费的HTML5连载来了《HTML5网页开发实例具体解释》连载(四)HTML5中的FileSystem接口...
  4. neo4j java label_Neo4j:在具有相同Label的两个或多个节点之间创建关系
  5. 怎样格式化电脑_电脑硬盘故障恢复软件:坏硬盘数据怎么恢复?
  6. LeetCode 1609. 奇偶树(层序遍历)
  7. java删除指定目录下文件_Java中循环删除指定目录下的文件
  8. java语言操作Oracle数据库中的CLOB数据类型
  9. overleaf 公式_Latex的公式输入
  10. 求职必备素材:个人简历Word模板
  11. vue-网页Logo标题及矢量图标
  12. 爬取王者荣耀皮肤-点券领取
  13. SQL Server 2012笔记分享-35:配置客户端网络协议
  14. 苹果公司的 iCloud
  15. 小老弟!听说你在搞Android 10.0 适配,看这篇就妥了!
  16. 机器学习理论-PAC learning
  17. BPL 和动态加载包
  18. 第二章 Etcd的初步认识
  19. 未来从事计算机职业规划,计算机专业职业生涯规划书2000字
  20. 数字疗法 | “接受”还是“拒绝”?心理治疗背后的数字干预

热门文章

  1. 基于zynq的千兆网udp项目_随时随地感受“沉浸式千兆体验”!海南互联网络迈入“三千兆”时代...
  2. Leetcode 213. 打家劫舍 II (每日一题 20211009)
  3. Leetcode 46.全排列 (每日一题 20210621)
  4. 点云网络的论文理解(七)-Frustum PointNets for 3D Object Detection from RGB-D Data
  5. R语言实战应用精讲50篇(十九)-R语言gganimate函数应用案例:静态图变成动态,让你的图表更酷炫
  6. react 调用组件方法_React源码分析1 — 组件和对象的创建(createClass,createElement)...
  7. 苹果系统修复若干办法
  8. 多线程下HashMap的死循环
  9. Windows键盘驱动结构与消息机制--转
  10. HTTPS从认识到线上实战全记录