xpath爬虫

embedded/2024/10/31 8:46:17/

xpath是什么

xpath是在XML文档中搜索内容的一门语言

html是xml的一个子集

具体实现

主要依靠lxml类中的etree
demo代码
用法1、XML

from lxml import etree  xml = """  
<book>  <id>1</id>    <name>        <nick id="10086">2112</nick>        <nick id="10010">4555</nick>        <nick class="joy">fgbgn</nick>        <nick class="jolin">goog</nick>        <dir>            <nick class="ksj">gogofff</nick>            <dir>                <nick class="ksj">ggogo</nick>            </dir>        </dir>    </name></book>  
"""  tree=etree.XML(xml)  # rer = tree.xpath("/book") /表示层级  
#  
# rerr= tree.xpath("/book/id") /表示层级  
#  
# result = tree.xpath("/book/id/text()")  /输出id层级的内容 test()拿文本  
# result = tree.xpath("/book/name/nick/text()") #输出nick里的所有内容  
# result = tree.xpath("/book/name/dir/nick/text()") #输出dir中nick的内容  
# result = tree.xpath("/book/name//nick/text()") #输出name节点中的所有节点中所有的nick节点的内容,//后代  
result = tree.xpath("/book/name/*/nick/text()") # *匹配任意节点,只匹配一层  print(result)

用法2、parse

from lxml import etree  tree =etree.parse("b.html")  result = tree.xpath("/html/a[@href='dabao']/text()") #从html中a里面的href=dapao的数据  result = tree.xpath("/html/@href")  #输出html中href中的数据 比如dapao  ol_li_list=tree.xpath("/html/a")  for li in ol_li_list:  result=li.xpath("./o/text()") #查找html/a/o/中的结果  result2=li.xpath("./o/@href") #查找/html/a/o/中href=xxx的内容

用法3、HTML

newstart

import requests  
from lxml import etree  
url ='http://eci-2zedc18yc0kv02b4wfp5.cloudeci1.ichunqiu.com/start'  
url1='http://eci-2zedc18yc0kv02b4wfp5.cloudeci1.ichunqiu.com/submit'  
s=requests.session()  
a=s.get(url).content  
tree=etree.HTML(a)  
titles = tree.xpath('//p/text()')  
result = "".join(titles)  
data={  "user_input":{result}  
}  
d=s.post(url1,data=data)  
print(d.text)

几行就没了,比re和bs4都快,但是可能没有re灵活

爬取blog信息练手

本来应该爬猪八戒网的,但是现在搞了个二次认证,不太好爬取

蹭蹭blog(以得到同意,不要模仿)

import requests  
from lxml import etree  url = 'https://noobxiaomeng.top/'  rspons = requests.get(url)  rel=rspons.content  tree =etree.HTML(rel)  rell=tree.xpath("//div/h6/text()") #查找个人信息  for i in rell:  print(i)  relll=tree.xpath("//header/a[@class='post-title']/text()") #爬取文章标题  rellll=tree.xpath("//header/a[@class='post-title']/@href") #爬取文章链接  for i,j in zip(relll,rellll):  print(i+":"+j+'\n')

与bs4爬取图库对比

bs4:

import requests  
from bs4 import BeautifulSoup  url = "https://www.umei.cc/bizhitupian/weimeibizhi/"  
resp = requests.get(url=url)  
resp.encoding = 'utf-8'  
re = BeautifulSoup(resp.text,"html.parser")  
ac = re.find("div",class_="Clbc_r_cont").find_all("a")  
for a in ac:  href = a.get("href")  print(href)  url2 = "https://www.umei.cc/"+href  page_re = requests.get(url2)  page_re.encoding = 'utf-8'  page_text = page_re.text  page = BeautifulSoup(page_text,"html.parser")  p=page.find("div",class_="big-pic")  img = p.find("img")  src = img.get("src")  #下载  img_re = requests.get(src)  img_re.content  img_name = src.split("/")[-1]  with open(img_name,mode="wb") as f:  f.write(img_re.content)  #图片保存  print("ob")  
print("over")
import requests  
from lxml import etree  url = 'https://www.umei.cc/katongdongman/dongmanbizhi/index_2.htm' #不存在1,1就不要添加后面的index,所以从2开始,多页面也可以进行遍历,没搞了  
re1=requests.get(url).content  
tree1 = etree.HTML(re1)  
tll=tree1.xpath('//div[@class="btns"]/a/@href') #读取页面链接  
for i in tll:  url2 ="https://www.umei.cc"+i  re2=requests.get(url2).content  tree2=etree.HTML(re2)  tlll = tree2.xpath('//div[@class="big-pic"]//img/@title') #匹配标题  tllll = tree2.xpath('//div[@class="big-pic"]//img/@src') #匹配链接  img_name = "".join(tlll)+'.jpg'  url3 = "".join(tllll)  img_re = requests.get(url=url3)  img_re.content  with open(img_name, mode="wb") as f:  f.write(img_re.content)  # 图片保存  print("ob")  
print('over')

可以发现比bs4简单


http://www.ppmy.cn/embedded/133823.html

相关文章

酱香经典——茅台镇的酱酒“四台”的传奇

“不在仁怀&#xff0c;便在通往仁怀的路上”&#xff0c;这句话生动地描绘了仁怀产区对酱酒文化的深远影响&#xff0c;这里不仅是世界十大烈酒产区之一&#xff0c;更是酱酒灵魂的栖息地。在仁怀茅台镇这一核心腹地&#xff0c;孕育了无数酱酒品牌&#xff0c;其中更有酱酒“…

百度集度嵌入式面试题及参考答案

linux 系统之间通信机制有哪些? Linux 系统之间存在多种通信机制,以下是一些常见的通信机制及其详细介绍。 管道(Pipe) 原理:管道是一种半双工的通信方式,数据只能单向流动。它基于文件描述符,在创建管道时会生成两个文件描述符,一个用于写入数据,另一个用于读取数据。…

详解RabbitMQ三种队列类型

RabbitMQ 是一个强大的消息队列系统&#xff0c;它提供了多种队列类型以满足不同的使用需求。本文将探讨三种主要队列类型&#xff1a;经典队列、仲裁队列和流式队列&#xff0c;并讨论它们的区别和选型建议。 经典队列&#xff08;Classic Queues&#xff09; 简介&#xff…

Spring Boot技术栈在厨艺分享平台中的应用

4 系统设计 4.1系统概要设计 厨艺交流平台并没有使用C/S结构&#xff0c;而是基于网络浏览器的方式去访问服务器&#xff0c;进而获取需要的数据信息&#xff0c;这种依靠浏览器进行数据访问的模式就是现在用得比较广泛的适用于广域网并且没有网速限制要求的B/S结构&#xff0c…

uniapp 使用uni.getRecorderManager录音,wav格式采样率低于44100,音频播放不了问题解决

如题&#xff1a;uniapp开发app端&#xff0c;使用uni.getRecorderManager录wav格式音频&#xff0c;采样率8000/16000都无法播放&#xff0c;44100可以播放。但由于项目需求需要录制采样率为8000的音频&#xff0c;于是引用了如下插件 插件地址(具体可以参考该插件的使用说明…

ADB指定进程名称kill进程

adb shell ps | grep <process_name> | awk {print $2} | xargs adb shell killadb shell ps&#xff1a;列出所有正在运行的进程。grep <process_name>&#xff1a;筛选出包含指定进程名称的行。awk ‘{print $2}’&#xff1a;提取输出中的第二列&#xff08;通常…

指针进阶(四)(C 语言)

目录 一、sizeof 和 strlen() 对比1. sizeof 操作符2. sizeof 操作符不会计算表达式的值3. strlen() 函数4. 确保传入 strlen() 函数的地址后面有空字符5. sizeof 和 strlen() 对比表格 二、数组和指针笔试题解析1. 一维数组2. 字符数组1. 代码 A2. 代码 B3. 代码C4. 代码 D5. …

python-opencv给图片或视频去水印

文章目录 引言inpaint函数的使用方法鼠标事件回调函数cv2.setMouseCallback介绍去水印步骤实现代码 引言 本文主要基于cv2.inpaint函数实现图片的水印去除。 inpaint函数基于图像修复算法&#xff0c;通过对缺陷区域周围像素的分析和插值&#xff0c;生成合适的像素值来填充缺…