失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 爬虫学习笔记(五)——网页解析工具(bs4 xpath)

爬虫学习笔记(五)——网页解析工具(bs4 xpath)

时间:2021-10-09 03:58:46

相关推荐

爬虫学习笔记(五)——网页解析工具(bs4 xpath)

一、BS4

1.1、前沿

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

安装

pip install beautifulsoup4

解析器

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

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

基本语法

(往下的示例均以下面的这个HTML代码作为案例)html_str="""<!DOCTYPE html><html><head><title>爬虫</title><meta charset="utf-8"><link rel="stylesheet" href=""><link rel="stylesheet" href=""><link rel="stylesheet" href="/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="">淘宝</a> <span class="link"><a class="product" href="">关于Python</a> <a href="">好好学习</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="">淘宝</a>

1.3、获取标属性

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

示例:

soup.a['href']#结果:''

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="">淘宝</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 来选取的。

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

谓语

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

实例:

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

Xpath通配符,选取未知节点

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

3.1、requests + bs4

import requestsfrom bs4 import BeautifulSoupurl = '/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 requestsfrom lxml import etreeurl = '/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)》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。