范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

Python爬虫之xpath语法及案例使用

  我们在写Python爬虫时,经常需要对网页提取信息,如果用传统正则表达去写会增加很多工作量,此时需要一种对数据解析的方法,也就是本章要介绍的Xpath表达式。 Xpath是什么
  XPath,全称  XML Path Language ,即 XML 路径语言,它是一门在 XML 文档中查找信息的语言。最初是用来搜寻 XML 文档的,但同样适用于 HTML 文档的搜索。所以在做爬虫时完全可以使用 XPath 做相应的信息抽取。
  XPath 的选择功能十分强大,它提供了非常简洁明了的路径选择表达式。另外,它还提供超过 100 个内置函数,用于字符串、数值、时间的匹配以及节点、序列的处理等,几乎所有想要定位的节点都可以用 XPath 来选取。
  下面介绍实战中常用的几个知识点,详细也可以看W3C介绍:https://www.w3school.com.cn/xpath/index.asp Xpath语法介绍路径常用规则
  表达式
  描述
  实例
  nodename
  选取此节点的所有子节点
  xpath("//p")
  选取了p节点的所有子节点
  /
  从根节点选取
  xpath("/p")
  从根节点上选取p节点
  //
  选取所有当前节点,不考虑位置
  xpath("//p")
  选取所有的p节点
  .
  选取当前节点
  xpath("./p")
  选取当前节点下的p节点
  ..
  选取当前节点的父节点
  xpath("..")
  回到上一个节点
  @
  选取属性
  xpath("//@calss")
  选取所有的class属性 谓语规则
  谓语被嵌在方括号内,用来查找某个特定的节点或包含某个制定的值的节点
  表达式
  结果
  xpath("/body/p[1]")
  选取body下的第一个p节点
  xpath("/body/p[last()]")
  选取body下最后一个p节点
  xpath("/body/p[last()-1]")
  选取body下倒数第二个p节点
  xpath("/body/p[positon() ]")
  选取body下前两个p节点
  xpath("/body/p[@class]")
  选取body下带有class属性的p节点
  xpath("/body/p[@class="main"]")
  选取body下class属性为main的p节点
  xpath("/body/p[price>35.00]")
  选取body下price元素值大于35的p节点 通配符
  通配符来选取未知的XML元素
  表达式
  结果
  xpath("/p/*")
  选取p下的所有子节点
  xpath("/p[@*]")
  选取所有带属性的p节点 取多个路径
  使用"|"运算符可以选取多个路径
  表达式
  结果
  xpath("//p|//table")
  选取所有的p和table节点 功能函数
  使用功能函数能够更好的进行模糊搜索
  函数
  用法
  解释
  starts-with
  xpath("//p[starts-with(@id,"ma")]")
  选取id值以ma开头的p节点
  contains
  xpath("//p[contains(@id,"ma")]")
  选取id值包含ma的p节点
  and
  xpath("//p[contains(@id,"ma") and contains(@id,"in")]")
  选取id值包含ma和in的p节点
  text()
  xpath("//p[contains(text(),"ma")]")
  选取节点文本包含ma的p节点 语法熟悉
  下面举一段HTML文本进行语法热身,代码如下 #!/usr/bin/env python# -*- coding: utf-8 -*-# time: 2022/8/8 0:05# author: gangtie# email: 648403020@qq.comfrom lxml import etreetext = """            
  • first item
  • second item
  • third item
  • fourth item
  • fifth item
"""# 调用HTML类进行初始化,这样就成功构造了一个XPath解析对象。# 利用etree.HTML解析字符串page = etree.HTML(text) print(type(page))   可以看到打印结果已经变成XML元素: 字符串转换HTML   字符串利用etree.HTML解析成html格式: print(etree.tostring(page,encoding="utf-8").decode("utf-8"))```
  • first item
  • second item
  • third item
  • fourth item
  • fifth item
Process finished with exit code 0```   经过处理可以看到缺失的 也自动补全了,还自动添加html、body节点。查找绝对路径   通过绝对路径获取a标签的所有内容 a = page.xpath("/html/body/p/ul/li/a")for i in a: print(i.text)```first itemsecond itemthird itemNonefifth item```查找相对路径(常用)   查找所有li标签下的a标签内容 html = etree.HTML(text)a = html.xpath("//a/text()")print(a)```["first item", "second item", "third item", "fifth item"]```当前标签节点   . 表示选取当前标签的节点。   我们先定位 ul 元素节点得到一个列表,打印当前节点列表得到第一个 ul,   接着打印 ul 节点的子节点 li,text()输出。 page = etree.HTML(text)ul = page.xpath("//ul")print(ul)print(ul[0].xpath("."))print(ul[0].xpath("./li"))print(ul[0].xpath("./li/a/text()"))```[][][, , , , ]["first item", "second item", "third item", "fifth item"]```父节点   .. 表示选取当前标签的父节点。   可以看到得到ul的上一级p page = etree.HTML(text)ul = page.xpath("//ul")print(ul[0].xpath("."))print(ul[0].xpath(".."))```[][]```属性匹配   匹配时可以用@符号进行属性过滤   查找a标签下属性href值为link2.html的内容 html = etree.HTML(text)a = html.xpath("//a[@href="link2.html"]/text()")print(a)```["second item"]```函数   last():查找最后一个li标签里的a标签的href属性 html = etree.HTML(text)a = html.xpath("//li[last()]/a/text()")print(a)```["fifth item"]```   contains:查找a标签中属性href包含link的节点,并文本输出 html = etree.HTML(text)a = html.xpath("//a[contains(@href, "link")]/text()")print(a)```["first item", "second item", "third item", "fifth item"]```实战案例   上面说完基本用法,接下来做几个实战案例练练手。 案例一:豆瓣读书# -*-coding:utf8 -*-# 1.请求并提取需要的字段# 2.保存需要的数据import requestsfrom lxml import etreeclass DoubanBook(): def __init__(self): self.base_url = "https://book.douban.com/chart?subcat=all&icn=index-topchart-popular" self.headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) " "Chrome/104.0.0.0 Safari/537.36" } # 请求并提取需要的字段 def crawl(self): res = requests.get(self.base_url, headers=self.headers) lis = etree.HTML(res.text).xpath("//*[@id="content"]/p/p[1]/ul/li") # print(type(lis)) books = [] for li in lis: # print(etree.tostring(li,encoding="utf-8").decode("utf-8")) # print("==================================================") title = "".join(li.xpath(".//a[@class="fleft"]/text()")) score = "".join(li.xpath(".//p[@class="clearfix w250"]/span[2]/text()")) # list输出带有[" 刘瑜 / 2022-4 / 广西师范大学出版社 / 82.00元 / 精装 "] publishing = "".join(li.xpath(".//p[@class="subject-abstract color-gray"]/text()")).strip() book = { "title": title, "score": score, "publishing": publishing, } books.append(book) self.save_data(books) def save_data(self, datas): with open("books.txt", "w", encoding="utf-8") as f: f.write(str(datas)) def run(self): self.crawl()if __name__ == "__main__": DoubanBook().run()案例二:彼岸图片下载#!/usr/bin/env python# -*- coding: utf-8 -*-# author: 钢铁知识库# email: 648403020@qq.comimport osimport requestsfrom lxml import etree# 彼岸图片下载class BiAn(): def __init__(self): self.url = "https://pic.netbian.com" self.headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) " "Chrome/104.0.0.0 Safari/537.36", "cookie": "__yjs_duid=1_cb922eedbda97280755010e53b2caca41659183144320; Hm_lvt_c59f2e992a863c2744e1ba985abaea6c=1649863747,1660203266; zkhanecookieclassrecord=%2C23%2C54%2C55%2C66%2C60%2C; Hm_lpvt_c59f2e992a863c2744e1ba985abaea6c=1660207771; yjs_js_security_passport=1225f36e8501b4d95592e5e7d5202f4081149e51_1630209607_js" } # 如果目录不存在会报错 if not os.path.exists("BianPicture"): os.mkdir("BianPicture") # 请求拿到ul列表 def crawl(self): res = requests.get(self.url, headers=self.headers) res.encoding = "gbk" uls = etree.HTML(res.text).xpath("//p[@class="slist"]/ul[@class="clearfix"]/li") # print(etree.tostring(uls,encoding="gbk").decode("gbk")) # 循环拿到图片名、图片地址,拼接请求再次下载到图片 for ul in uls: img_name = ul.xpath(".//a/b/text()")[0] img_src = ul.xpath(".//a/span/img/@src")[0] # print(img_name + img_src) img_url = self.url + img_src # 拼接后下载图片,转义Bytes img_res = requests.get(img_url, headers=self.headers).content img_path = "BianPicture/" + img_name + ".jpg" data = { "img_res": img_res, "img_path": img_path } self.save_data(data) # 数据保存逻辑 def save_data(self, data): with open(data["img_path"], "wb") as f: f.write(data["img_res"]) # print(data) def run(self): self.crawl()if __name__ == "__main__": BiAn().run()   案例三:全国城市名称爬取#!/usr/bin/env python# -*- coding: utf-8 -*-# author: 钢铁知识库# email: 648403020@qq.comimport osimport requestsfrom lxml import etreeclass CityName(): def __init__(self): self.url = "https://www.aqistudy.cn/historydata/" self.headers = { "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36" } # 判断目录是否存在 if not os.path.exists("city_project"): os.mkdir("city_project") def crawl(self): res = requests.get(url=self.url, headers=self.headers).text uls = etree.HTML(res).xpath("//p[@class="all"]/p[2]/ul/p[2]/li") all_city_name = list() for ul in uls: city_name = ul.xpath(".//a/text()")[0] # print(type(city_name)) all_city_name.append(city_name) self.save_data(all_city_name) def save_data(self, data): with open("./city_project/city.txt", "w") as f: f.write(str(data)) def run(self): self.crawl()if __name__ == "__main__": CityName().run()xpath使用工具chrome生成XPath表达式   经常使用chome的朋友都应该知道这功能,在 审查 状态下(快捷键ctrl+shift+i,F12),定位到元素(快捷键ctrl+shift+c) ,在Elements选项卡中,右键元素 Copy->Copy xpath,就能得到该元素的xpath了   Xpath Helper插件   为chome装上XPath Helper就可以很轻松的检验自己的xpath是否正确了。安装插件需要特别上网,安装好插件后,在chrome右上角点插件的图标,调出插件的黑色界面,编辑好xpath表达式,表达式选中的元素被标记为黄色   ---- 钢铁侠的知识库 2022.08.15 结语:   以上就是利用XPath的所有用法,从常用语法,到案例练习都走了一遍。下一章 钢铁知识库 会继续介绍另一种好用的解析框架,Beautiful Soup   文章来自https://www.cnblogs.com/jiba/p/16589856.html

克莱我和库里都是好好先生,是追梦在干脏活打普尔是有原因的北京时间4月6日星期四,最近克莱汤普森参加了前NBA球星伊巴卡的访谈节目,谈到了队友追梦格林库里普尔等人,吐露心声表达了对众人的看法。汤普森表示如果没有追梦格林,我和库里不会拿到这支付宝花呗借呗被降额了怎么办?原因已经找到大家好,我是老葛,最近经常看到有网友留言,说支付宝的花呗借呗被降额了,甚至被降为零了,怎么办?想要解决这些问题,首先我们就要找到花呗借呗被降额的原因,只有对症下药才能取得事半功倍的截至目前,盘点2023年搭载骁龙8处理器的手机,共7款1华为P60搭载第一代骁龙84G处理器,采用台积电4nm制程工艺,CPU超大核主频为3。0GHz,带来更高能效比,更低功耗,无论多线程工作还是大屏沉浸游戏,均可轻松应对正面是一块6美媒从第一句你能听到吗到现在,手机已经50岁了来源环球时报美国基督教科学箴言报4月3日文章,原题从第一句你能听到吗?到现在,手机已经50岁了50年前,从口袋里掏出手机打电话给别人是难以想象的事情,但它后来变成了现实。自1973目前哪一款手机,价格低配置高目前哪一款手机,价格低配置高作者推荐真我10Pro外观我上手的是星耀之光配色,炫耀夺目的光锥纹理从镜头的位置散发开来,拿在手上很有辨识度屏幕真我10Pro最大的亮点是搭载了一块具备河北吴桥杂技尽展技艺之美不用去吴桥,没想到家门口也能看到这么精彩的杂技剧。日前,由吴桥杂技大世界演绎的大型情景杂技剧江湖在德州大剧院盛大上演,演员以最饱满的精神状态,演绎吴桥杂技的沧桑千年,赢得观众阵阵掌特斯拉OTA升级2023。6。1发行说明2023。6。1发行说明1。方向盘发热根据气候控制设定温度自动加热方向盘。要访问加热控件,请点击温度设置。2。冰岛语您现在可以选择冰岛语作为您的触摸屏语言。要更新您的语言设置,请点刘国梁新当选乒协主席,对中国足球有什么启示刘国梁连任乒协主席,在近期张继科热点不断的情况下,是个微妙的节点。而我看到的重点是王励勤任乒协副主席。这就是在足球界缺少的一个重要的要点传承。外界有人认为乒协在刘国梁治下,看起来像国王杯皇马晋级决赛4月5日,皇家马德里队球员在比赛后庆祝胜利。新华社发(胡安戈萨摄)当日,在20222023赛季西班牙国王杯半决赛第二回合比赛中,皇家马德里队客场以4比0战胜巴塞罗那队,从而以4比1祖巴茨我要去参加鲍威尔的训练营学习如何造犯规直播吧4月6日讯今日NBA常规赛,快船在主场以125118击败湖人。赛后,祖巴茨接受了记者采访。他表示本赛季他将要加入鲍威尔的训练营去学习如何造犯规。此役,祖巴茨出场33分钟10投假球赌球是孪生儿,反腐反黑缺一不可2023年4月1日,国家体育总局党组成员副局长杜兆才被查。杜兆才担任中国足协党委书记副主席,是本次足坛反腐风暴中落马级别最高的官员。而从李铁算起,短短四个月,中国足球领域已有多人被
美团单车宣布涨价,最高上涨达30元红星资本局8月6日消息,美团单车8月5日发布公告,由于硬件和维护成本的增加,从2022年8月10日23时起,将对骑行畅骑卡价格进行调整。美团单车公告显示,7天卡无折扣价由10元调整终极大作至尊升级,红米K50至尊版真的就要来了,体验真正豪华任市场风雨大作,我却岿然不动。用这句话来形容如今的小米简直太合适不过了。无论产品的市场效果如何,小米始终不忘初心前赴后继地推出全新旗舰产品。如今的小米以及逐渐褪去了当年跟风苹果的光vivoX90Pro曝光,120Hz4nm5500mAh,200w快充加持在这个竞争激烈的时代,手机市场也不例外,关注手机市场的用户就知道,手机更新是很快的,vivo手机还是有很多优点的,第一vivo的电池是很耐用的,外观精致,简约时尚,第二vivo手机不用侧边指纹,RedmiK50至尊版被曝将采用屏下指纹IT之家8月6日消息,昨天红米手机官方正式官宣了K50宇宙终极大作RedmiK50至尊版,新机将于本月与我们见面,现在数码博主数码闲聊站带来了RedmiK50的最新爆料信息。据数码成年人的妥协头号周刊一半理解,一半算了,这是成年人的妥协,年纪越来越大,慢慢就会明白,时间带给我们的是通透,许多事到了最后不是解决了,而是算了。不是你拼命追赶的人就是合适的,而是当你累的手里还看再多的书,都不如看这20句话人性商战,一针见血!1金钱乱了年纪,也乱了辈分,还能乱了爱情,能让很多人的喜好颠覆。2和人交往,永远是先看利益。不能给你带来利益的人,你见他干啥?穷人的第一战略是搞钱,而不是搞感情跳票三次,双点校园即将上线,见证教育典范的诞生或陨落牛蛙公司在1997年制作并发行了游戏主题医院,20年之后原版人马再次打造出了双点医院,听名字就知道,两款游戏都是以医院为题材。又过了两年,时间来到2022年,还是原来那批人又推出了10。0狂徒贼4套天赋加点推荐(8月6日更新)暴雪最初放出的图7月16日推荐的2套天赋6星吸血双刀抹杀流6星吸血绿皮流8月6日更新一6星双骰7连绿皮流火枪大佬说明由于天赋树版本更新,有一些微量调整。但总体和上次差别不大。舍弃了排位黑科技强攻破败女枪强势压制!韩服女枪出装新思路导语女枪自身爆发高对线压制能力强,一直以来都是许多AD位玩家钟爱选择的英雄。但是女枪的加点出装以往都比较固定,有一个很常规的模式。近期在韩服的高分段,出现了一种主升W裸破败思路的女智能锁指纹锁怎么选,快来看看吧智能锁是入户安全的第一道防线,是开启智能家居生活的第一步,是钥匙健忘症患者的福音,那么该怎么选择指纹锁恁,看过来吧!!!一什么是智能锁简单地理解在机械锁上加了一些电动的控制。在指纹AMDR7000系列处理器要提早到8月4日官宣?据外媒消息称AMD将于北京时间8月4日下午500召开一场名为专家会面(MeettheExperts)的活动。从注册页面上了解到这场活动主要是展示介绍支持AM5接口的X670E(X6