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

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

心渊梦境开发日志视频发布!心渊梦境Steamdeck实机演示画面近日,心渊梦境发布了首个开发手札视频,公布了大量新情报,包括Steamdeck实机演示画面设定原画图等。这款2D类银河恶魔城游戏是由上海烛龙负责开发的单机买断制新品,感兴趣的朋友一快手白路打破纪录,登顶未来之役全球榜一!这个位置必须属于我们喜欢射击游戏的小伙伴想必都知道了吧,绝地求生手游版已经在日前上线了,名字很有现代感,就叫未来之役!资深玩家们再也不需要守在电脑前,只需要用手机就可以体验原汁原味的吃鸡。不过必须说一CFS总决赛AG横扫越南队BS差点翻车,马哲直言AG决赛胜算更高CFS世界总决赛进入,到了半决赛阶段,代表中国赛区的两支战队AG和BS,成功闯入到了半决赛。快手平台全程姐全程直播了,这次CFS系列赛,并请出了CS的前职业选手和超人气主播马哲前来手游剑与远征新奇境冰湖之国你还会被关?别头铁打BOSS亲爱的小伙伴,抠门又带着先遣服的最新资讯来了。最新的奇境冰湖之国,又有着新的玩法和剧情,而1。78版本,也增加了新的福利活动,那么具体是怎样的?抠门这就来说说。新奇境冰湖之国1。终LOL全球前十打野,中国内地仅厂长一人1Jankos,小羊排第一,开玩笑的吧,一次s赛冠军都没拿到,实在是不能服众。2Score,老队长和小羊差不多吧,在各自赛区打野中都是顶级存在,但是缺少s赛冠军3Karsa,雷达哥华晨宇张碧晨宣布有孩子一周年,两人被曝低调复合,疑似资源共享马上过年了,现在大家应该都在家里面准备着几天之后的年夜饭了,但是很多追星人也发现了今天的不一般,今天是华晨宇和张碧晨宣布有女儿一周年,这天还真的是网友激动粉丝心碎的日子了。当初这两科学家种种迹象表明,地球或许正在进入第六次生物大灭绝地球是一颗有生命存在的星球,在地球上生存着很多生物,有海洋生物有陆地生物有两栖生物和微生物,人类就是由陆地生物进化而来的,根据科学家的研究我们能够知道,在200万年前,猿类生存在地谁是你心目中的最强四号?四号球衣的传说四号球衣该是什么模样?四号球衣是斯科拉的样子,从一头秀发到两鬓斑白,也许他从没有被列入最伟大的球员的范畴,但斯科拉在部分人心里就是内线脚步的代名词。他是最闪亮的钻石。四号球衣是小土NASA毅力号团队在清除鹅卵石堵塞样品管过程中取得良好进展美国宇航局(NASA)的火星2020任务团队一直在有条不紊地努力工作,在了解从毅力号火星车的取样转盘上清除堵塞鹅卵石的最佳方案方面取得了良好进展。在过去几天里,NASA团队开发和测孙杨团队做了一次成功的事件营销孙杨最近带货直播直播上了热搜,销售数据虽然说法不一,但金额肯定也是惊人的,我看到的最高的金额是两场直播5000万,也有人说是3000万,不管数字多少,战绩都是不错的。孙杨作为一个年NBA5大名不副实的球星!场均258全明星第1,利拉德第4!威少上榜在NBA这个竞技联盟当中,来来往往有很多的球员涌现和离开,但是总有一部分有实力的球员,能够长久的在联盟中拥有自己稳定的位置,他们大部分都是顶尖的球星。即便在时间的流逝下,他们的能力
郑钦文李娜退役8年后的惊喜2014年亚洲传奇李娜退役。自此,亚洲再无李娜。至于后来在世界女网百花齐放百家争鸣,洪水泛滥大失水准的混乱时期横空出世的大阪直美,那也不过是日海混血,昙花一现,不可与李娜那个时代相利物浦球迷鲁莽行事害人害己,利物浦方面已经展开调查本赛季的欧冠联赛决赛开球前发生事故,数百名没有门票的利物浦球迷企图硬闯进场看决赛,结果巴黎警方要出动胡椒喷雾和催泪弹平息事件,这也一度让赛事延迟36分钟开赛。最离谱的是这事连累不少56分50分43分!联盟第一!对不起KD,他仍是最强的联盟第一人NBA总裁萧华非常会打造商业联盟他上台之后,联盟开启了造星计划,越来越多的超新星崛起,独当一面,联盟有意无意都在暗中推动超新星快速崛起,推动联盟的发展,更新换代,让更加年轻球星接班球队内线支柱!西决场均10。6分10。6板3助攻,勇士能否续约卢尼?北京时间5月29日,勇士名宿里克巴里在参加一档节目时,称赞了勇士中锋凯文卢尼在今年季后赛的表现,巴里表示如果要选出一个很大程度上左右了比赛胜负的勇士球员,那就是卢尼。他在过去的这轮14岁乒坛天才少女40夺冠!奖金5000美元,如今世界排名超刘诗雯2022年非洲乒乓球杯在尼日利亚结束,女子单打冠军是14岁的埃及选手格达。她以40击败了尼日利亚的贝洛,赢得了冠军。现在,格达已经获得了5000美元的冠军奖金,排名第43位,远远超世界级自由人王梦洁,为何成为边缘队员?蔡斌或许有这样的打算已经出征世联赛首站举办地土耳其的中国女排,将于6月1日迎战欧洲劲旅荷兰女排,开始新一届国家女排的首次国际大赛亮相,而主帅蔡斌指导会派出怎样的首发阵容出战,引发不少媒体和球迷的猜测,一个人越厉害,越懂得借力01hr韩非子说顺风而呼,声非加疾,其势激也。也就是说,一个人顺风呼喊,声音会传播得更远,这是自然规律带来的力量。万物皆有规律,如果能够把规律用起来,那么万物都变成了自己的帮手。很情在雪中生黄碧嫦作者简介黄碧嫦。1965。10生,曾经代课10年,闲来无事,记录生活点滴。南方的雪就像久违的诗柬,点燃着孩童们冬倦的心情。夜是多么的寒冷,北风潇潇,满天的雪花纷纷洒洒地飘落了要做一个独一无二的自己不管在什么样的情况下,我都要做最好的自己,独一无二的自己。如何做独一无二?就是不人云亦云,不崇洋媚外,有自己的思想自己的判断,不管别人异样的眼光,做最正确的自己。时常在我老公面前吹欧文亚隆成为我自己这三个真实的人生真相,越早懂越好文微微笑了成为我自己,多么漂亮的宣言。但,成为怎样的自己,如何度过此生,见仁见智,这没有标准答案。曾听过,人生只有一种成功的方式,那就是按照自己喜欢的方式度过一生。正如,王小波所说韩磊苦追王燕2年,39岁终于得偿所愿,结婚16年感情仍如胶似漆文丨豆芽儿编辑丨懒虫说娱2014年,歌手韩磊做客鲁豫有约时,被鲁豫公然表白我觉得你是一个非常顾家的好男人,你说话的语气在我心目中加了很多分。面对鲁豫的表白,韩磊只是微微抿唇一笑,眼