XPath入门

📝 主旨内容

一、XPath语法


XPath 使用路径表达式来选取 XML 文档中的节点或节点集。节点是通过沿着路径 (path) 或者步 (steps) 来选取的。


(一)XML实例文档

我们将在下面的例子中使用这个 XML 文档。

实例

<?xml version="1.0" encoding="UTF-8"?>
<bookstore><book><title lang="eng">Harry Potter</title><price>29.99</price></book><book><title lang="eng">Learning XML</title><price>39.95</price></book>
</bookstore>

  • 选取节点

XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径或者 step 来选取的。 下面列出了最有用的路径表达式:

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

在下面的表格中,我们已列出了一些路径表达式以及表达式的结果:

路径表达式结果
bookstore选取所有名为 bookstore 的节点。
/bookstore选取根元素 bookstore。注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径!
bookstore/book选取属于 bookstore 的子元素的所有 book 元素。
//book选取所有 book 子元素,而不管它们在文档中的位置。
bookstore//book选择属于 bookstore 元素的后代的所有 book 元素,而不管它们位于 bookstore 之下的什么位置。
//@lang选取名为 lang 的所有属性。

  • 谓语(Predicates)

谓语用来查找某个特定的节点或者包含某个指定的值的节点。

谓语被嵌在方括号中。

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

路径表达式结果
/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 通配符可用来选取未知的 XML 元素。

通配符描述
*匹配任何元素节点。
@*匹配任何属性节点。
node()匹配任何类型的节点。

在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:

路径表达式结果
/bookstore/*选取 bookstore 元素的所有子元素。
//*选取文档中的所有元素。
//title[@*]选取所有带有属性的 title 元素。

  • 选取若干路径

通过在路径表达式中使用"|"运算符,您可以选取若干个路径。

在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:

路径表达式结果
//book/title//book/price
//title//price
/bookstore/book/title//price

(二)XPath 轴(Axes)


  • XML 实例文档

我们将在下面的例子中使用此 XML 文档:

<?xml version="1.0" encoding="UTF-8"?>
<bookstore><book><title lang="en">Harry Potter</title><price>29.99</price></book><book><title lang="en">Learning XML</title><price>39.95</price></book>
</bookstore>

  • XPath 轴(Axes)

轴可定义相对于当前节点的节点集。

轴名称结果
ancestor选取当前节点的所有先辈(父、祖父等)。
ancestor-or-self选取当前节点的所有先辈(父、祖父等)以及当前节点本身。
attribute选取当前节点的所有属性。
child选取当前节点的所有子元素。
descendant选取当前节点的所有后代元素(子、孙等)。
descendant-or-self选取当前节点的所有后代元素(子、孙等)以及当前节点本身。
following选取文档中当前节点的结束标签之后的所有节点。
following-sibling选取当前节点之后的所有兄弟节点
namespace选取当前节点的所有命名空间节点。
parent选取当前节点的父节点。
preceding选取文档中当前节点的开始标签之前的所有节点。
preceding-sibling选取当前节点之前的所有同级节点。
self选取当前节点。

(三)XPath运算符


XPath 表达式可返回节点集、字符串、逻辑值以及数字。


  • XPat运算符

下面列出了可用在XPath表达式中的运算符:

运算符描述实例返回值
计算两个节点集//book
+加法6 + 410
-减法6 - 42
*乘法6 * 424
div除法8 div 42
=等于price=9.80如果 price 是 9.80,则返回 true。如果 price 是 9.90,则返回 false。
!=不等于price!=9.80如果 price 是 9.90,则返回 true。如果 price 是 9.80,则返回 false。
<小于price<9.80如果 price 是 9.00,则返回 true。如果 price 是 9.90,则返回 false。
<=小于或等于price<=9.80如果 price 是 9.00,则返回 true。如果 price 是 9.90,则返回 false。
>大于price>9.80如果 price 是 9.90,则返回 true。如果 price 是 9.80,则返回 false。
>=大于或等于price>=9.80如果 price 是 9.90,则返回 true。如果 price 是 9.70,则返回 false。
orprice=9.80 or price=9.70如果 price 是 9.80,则返回 true。如果 price 是 9.50,则返回 false。
andprice>9.00 and price<9.90如果 price 是 9.80,则返回 true。如果 price 是 8.50,则返回 false。
mod计算除法的余数5 mod 21
  • 可维护性更强:XPath相对定位可以相对于其他元素的方式来定位元素。如果页面结构发生变化,只需要更新相对路径中的某些部分,而不必重新创建整个定位表达式。
  • 语法更加简洁:XPath相对路径是相对于其他元素的路径,更容易理解和编写。与复杂的绝对路径相比,相对路径语法更加简洁。
  • 相比于css可以支持更多的方式:XPath相对定位可以访问XML和HTML文档的任何部分,而不仅仅是元素和属性。

示例代码如下:

# 相对路径
//*[@id="ember284"]/td[1]/span/a
# 绝对路径
/html/body/section/div/div[2]/div[2]/div[5]/div[2]/div/div/div[2]/table/tbody/tr[2]/td[1]/span/a

二、XPath定位的调试方式

XPath 是一种在 XML 文档中查找信息的语言,它也被广泛应用于网页爬虫中,用于定位 HTML 文档中的元素。以下是关于使用浏览器控制台(console)调试 XPath 表达式的方法:

(一)浏览器控制台调试 XPath 的步骤:

  1. 打开浏览器开发者工具

  • 在大多数现代浏览器中,可以通过右键点击页面元素并选择“检查”(或使用快捷键F12,如 Ctrl+Shift+I / Cmd+Option+I)来打开开发者工具。

有些人的浏览器开发者工具可能设置成了英文,右上角三个点选择Settings设置,修改语言为简体中文即可。

  1. 切换到控制台(Console)标签

    • 在开发者工具中,通常有一个标签或面板叫做“Console”,点击它即可打开控制台。

  1. 使用 $x 函数

    • 在控制台输入 $x('XPath 表达式'),其中"XPath 表达式"是你想要测试的 XPath 语句。(这里一定要注意确保所有的引号都正确匹配,如果不匹配可能会报错“VM1720:1 Uncaught SyntaxError: missing ) after argument list”之类的语法错误)
    • 按下回车键执行。

  1. 查看结果

    • 如果XPath表达式正确,控制台将返回一个包含匹配元素的NodeList。
    • 如果没有匹配的元素,将返回一个空数组。
    • 如果XPath表达式有语法错误,控制台将显示错误信息。

(二)调试技巧:

  • 检查表达式:确保XPath表达式正确无误,包括使用正确的轴(例如 child::descendant::)、节点测试(例如 element()text())和谓语(例如 [1][@id='example'])。
  • 逐步构建:从简单的 XPath 开始,逐步添加条件,直到定位到目标元素。
  • 使用浏览器的元素面板:在元素面板中,你可以右键点击一个元素,选择“Copy”然后“Copy XPath”,这通常会给出一个可以参考的XPath表达式。
  • 注意命名空间:如果文档使用 XML 命名空间,XPath表达式需要正确处理这些命名空间。

示例:

假设你想要找到页面上所有带有 class="example"div 元素,你可以在控制台输入以下命令:

$x("//div[@class='example']")

这将返回所有匹配的 div 元素。如果返回结果不符合预期,你可能需要调整 XPath表达式。 通过以上步骤,你可以有效地调试和优化你的 XPath 表达式,以便在爬虫中正确地定位网页元素。

三、XPath基础语法(包含关系)

这里以测试人社区为例(测试人社区 - 软件测试开发爱好者的交流社区,交流范围涵盖软件测试、自动化测试、UI测试、接口测试、性能测试、安全测试、测试开发、测试平台、开源测试、测试教程、测试面试题、appium、selenium、jmeter、jenkins)%2F),F12进入开发者模式,选择console

  • 整个页面
$x("/")

  • 整个页面中的唯一根元素
$x("/*")

  • 整个页面中的所有元素
$x("//*")

  • 查找页面上所有的 div 标签节点
$x("//div")

 

  • 查找 id 属性为 site-logo 的节点
$x('//*[@id="site-logo"]')

  • 查找节点的父节点
$x('//*[@id="site-logo"]/..')

 

  • XPath 顺序关系(索引)

XPath 通过索引直接获取对应元素:

# 获取此节点下的所有的li元素
$x("//*[@id='ember15']//li")
# 获取此节点下【所有的节点的】第一个li元素
$x("//*[@id='ember15']//li[1]")

 

四、XPath 高级用法实战

打开测试人社区(测试人社区 - 软件测试开发爱好者的交流社区,交流范围涵盖软件测试、自动化测试、UI测试、接口测试、性能测试、安全测试、测试开发、测试平台、开源测试、测试教程、测试面试题、appium、selenium、jmeter、jenkins)%2F),F12 进入开发者模式。

注意:所有的表达式需要和[]结合。

  • 选取最新的元素

选取最后一个 div 标签

$x("(//div)[last()]")

 

  • 多个属性共同定位-交集

选取属性 id 的值为 ember24 并且属性 class 的值为 nav-item_new new ember-view 的 input 标签

$x("//*[@class='nav-item_new new ember-view' and @id ='ember24']")

 

  • 多属性共同定位-并集

选取属性 id 的值为 ember24 或属性 id 的值为 ember23 的 input 标签

$x("//*[@id='ember23'or@id ='ember24']")

 

  • 文本信息定位

选取所有文本信息为'所有类别'的元素

$x('//*[text()="所有类别"]')

 

  • 文本信息包含定位

选取所有文本信息包'Python 测试开发'的元素

$x('//*[contains(text(),"Python")]'

 

五、Xpath定位-实战

测试步骤

  1. 设置测试环境:
    • 配置日志
    • 启动Chrome浏览器(最大化窗口)
    • 设置隐式等待时间为20秒
  2. 开始测试:
    • 打开网页 测试人社区 - 软件测试开发爱好者的交流社区,交流范围涵盖软件测试、自动化测试、UI测试、接口测试、性能测试、安全测试、测试开发、测试平台、开源测试、测试教程、测试面试题、appium、selenium、jmeter、jenkins
    • 等待5秒(使用time.sleep(5))
  3. 查找并点击"类别"元素:
    • 尝试使用三个不同的XPath表达式来定位元素: a. "//[@id='ember23'or@id ='ember24']" b. "//[text()='所有类别']" c. "//*[contains(text(),'Python')]"
    • 对每个XPath,使用WebDriverWait等待最多15秒,直到元素可点击
    • 如果找到元素,则点击它
    • 如果所有XPath都失败,抛出NoSuchElementException异常
  4. 等待3秒(使用time.sleep(3))
  5. 结束测试:
    • 如果没有遇到异常,记录"测试通过"
    • 如果遇到异常(TimeoutException, NoSuchElementException, 或其他异常),记录错误并保存屏幕截图
  6. 清理测试环境:
    • 关闭浏览器

这个测试主要是验证能否在网页上找到并点击"类别"元素。它没有进行任何进一步的验证或断言。测试的主要目是检查网页的基本加载情况和特定元素的可用性。

Python 实现

import logging
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException, NoSuchElementException
import time# 配置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')class Test():def setup(self):logging.info("设置测试环境")service = Service()options = webdriver.ChromeOptions()options.add_argument("--start-maximized")  # 最大化浏览器窗口self.driver = webdriver.Chrome(service=service, options=options)self.driver.implicitly_wait(20)  # 增加隐式等待时间logging.info("浏览器已启动")def teardown(self):logging.info("清理测试环境")self.driver.quit()logging.info("浏览器已关闭")def test_xpath(self):try:logging.info("开始测试")self.driver.get("<https://www.ceshiren.com>")logging.info("已打开测试网页")time.sleep(5)  # 增加等待时间# 尝试多个可能的XPathxpaths = ["//*[@id='ember23'or@id ='ember24']","//*[text()='类别']","//*[contains(text(),'Python')]"]category_element = Nonefor xpath in xpaths:try:logging.info(f"尝试使用XPath: {xpath}")category_element = WebDriverWait(self.driver, 15).until(EC.element_to_be_clickable((By.XPATH, xpath)))if category_element:logging.info(f"找到元素,使用的XPath: {xpath}")breakexcept:logging.warning(f"未找到元素,XPath: {xpath}")if category_element:logging.info("'类别'元素已找到,准备点击")category_element.click()logging.info("已点击'类别'元素")else:raise NoSuchElementException("无法找到'类别'元素")time.sleep(3)  # 给页面反应一些时间logging.info("测试通过")except TimeoutException:logging.error("等待元素超时")self.driver.save_screenshot("timeout_error.png")raiseexcept NoSuchElementException:logging.error("未找到指定元素")self.driver.save_screenshot("element_not_found.png")raiseexcept Exception as e:logging.error(f"发生未预期的错误: {str(e)}")self.driver.save_screenshot("unexpected_error.png")raiseif __name__ == "__main__":test = Test()try:test.setup()test.test_xpath()finally:test.teardown()
from lxml import etree# 示例 HTML 文本
text = '''
<div><ul><li class="item-0"><a href="<https://blog.csdn.net/Gltu_java?spm=1010.2135.3001.5343/link1.html>"><span>first item</span></a></li><li class="item-1"><a href="<https://blog.csdn.net/Gltu_java?spm=1010.2135.3001.5343/link2.html>">second item</a></li><li class="item-inactive"><a href="<https://blog.csdn.net/Gltu_java?spm=1010.2135.3001.5343/link3.html>">third item</a></li><li class="item-1"><a href="<https://blog.csdn.net/Gltu_java?spm=1010.2135.3001.5343/link4.html>">fourth item</a></li><li class="item-0"><a href="<https://blog.csdn.net/Gltu_java?spm=1010.2135.3001.5343/link5.html>">fifth item</a></li></ul>
</div>
'''
# 构造 XPath 解析对象
html = etree.HTML(text)
# 选择文档中的所有节点
result = html.xpath('//*')
# 打印所有节点
print("选取所有节点:", result)
# 选择所有的 li 节点
result = html.xpath('//li')
# 打印所有 li 节点
print("选取所有li节点:", result)
# 选择所有 li 节点的直接子节点 a
result = html.xpath('//li/a')
# 打印所有 li 节点的直接子节点 a
print("选取所有直接a子节点:", result)
# 选取所有子孙a节点
result = html.xpath('//ul//a')
print("选取所有子孙a节点:", result)
# 获取指定 href 的 a 节点的父节点的 class 属性
result = html.xpath('//a[@href="<https://blog.csdn.net/Gltu_java?spm=1010.2135.3001.5343/link4.html>"]/../@class')
# 打印父节点的 class 属性
print("选取特定href的a节点,并获取其父节点的class属性:", result)
# 选择所有 class 属性为 item-0 的 li 节点
result = html.xpath('//li[@class="item-0"]')
# 打印所有 class 属性为 item-0 的 li 节点
print("选取class为item-0的li节点:", result)
# 获取所有 class 属性为 item-0 的 li 节点的子节点 a 的文本
result = html.xpath('//li[@class="item-0"]/a/text()')
# 打印所有 class 属性为 item-0 的 li 节点的子节点 a 的文本
print("获取所有class属性为item-0的li节点的子节点a的文本:", result)
# 获取所有 li 节点的子节点 a 的 href 属性
result = html.xpath('//li/a/@href')
# 打印所有 li 节点的子节点 a 的 href 属性
print("获取所有li节点的子节点a的href属性:", result)
# 选择 class 属性包含 li 的 li 节点
text = '''
<li class="li li-first"><a href="<https://blog.csdn.net/Gltu_java?spm=1010.2135.3001.5343/link.html>">first item</a></li>
'''
html = etree.HTML(text)
result = html.xpath('//li[contains(@class, "li")]/a/text()')
# 打印所有 class 属性包含 li 的 li 节点的子节点 a 的文本
print("选择 class 属性包含 li 的 li 节点", result)
# 选择同时满足多个属性的节点
text = '''
<li class="li li-first" name="item"><a href="<https://blog.csdn.net/Gltu_java?spm=1010.2135.3001.5343/link.html>">first item</a></li>
'''
html = etree.HTML(text)
result = html.xpath('//li[contains(@class, "li") and @name="item"]/a/text()')
# 打印所有同时满足 class 属性包含 li 和 name 属性为 item 的 li 节点的子节点 a 的文本
print("选择同时满足多个属性的节点", result)
# 10. 按序选择节点
result = html.xpath('//li[1]/a/text()')
# 打印第一个 li 节点的子节点 a 的文本
print("打印第一个 li 节点的子节点 a 的文本", result)
result = html.xpath('//li[last()]/a/text()')
# 打印最后一个 li 节点的子节点 a 的文本
print("打印最后一个 li 节点的子节点 a 的文本", result)
result = html.xpath('//li[position()<3]/a/text()')
# 打印前两个 li 节点的子节点 a 的文本
print("打印前两个 li 节点的子节点 a 的文本", result)
result = html.xpath('//li[last()-2]/a/text()')
# 打印倒数第三个 li 节点的子节点 a 的文本
print("打印倒数第三个 li 节点的子节点 a 的文本", result)
# 使用 XPath 轴选择节点
result = html.xpath('//li[1]/ancestor::*')
# 打印第一个 li 节点的所有祖先节点
print("使用 XPath 轴选择节点", result)
result = html.xpath('//li[1]/ancestor::div')
# 打印第一个 li 节点的 div 祖先节点
print("打印第一个 li 节点的 div 祖先节点", result)
result = html.xpath('//li[1]/attribute::*')
# 打印第一个 li 节点的所有属性
print("打印第一个 li 节点的所有属性", result)
result = html.xpath('//li[1]/child::a[@href="<https://blog.csdn.net/Gltu_java?spm=1010.2135.3001.5343/link1.html>"]')
# 打印第一个 li 节点的直接子节点 a,且其 href 属性符合条件
print("打印第一个 li 节点的直接子节点 a,且其 href 属性符合条件", result)
result = html.xpath('//li[1]/descendant::span')
# 打印第一个 li 节点的所有子孙节点中的 span 节点
print("打印第一个 li 节点的所有子孙节点中的 span 节点", result)
result = html.xpath('//li[1]/following::*[2]')
# 打印第一个 li 节点后的第二个节点
print("打印第一个 li 节点后的第二个节点", result)
result = html.xpath('//li[1]/following-sibling::*')
# 打印第一个 li 节点后的所有同级节点
print("打印第一个 li 节点后的所有同级节点", result)

🤗 总结归纳

XPath概要

本教程已经讲解了如何在 XML 文档中查找信息。

学习了如何使用 XPath 通过元素和属性在 XML 文档中进行导航。

学习了如何使用 XPath 中内建的某些标准函数。

如需更多有关 XPath 的信息,请阅读《XPath 参考手册》。


已经学习了XPath,下一步应当学习什么呢?

下一步应该学习 XSLT、XQuery、XLink以及XPointer。

  • XSLT

XSLT是针对XML文件的样式表语言。

通过XSLT,您可以把XML文件转换为其他的格式,比如XHTML。

如果希望学习更多有关XSLT的知识,请访问菜鸟教程的《XSLT 教程》。

  • XQuery

XQuery和XML数据查询有关。

XQuery被设计用来查询任何可作为 XML形态呈现的数据,包括数据库。

如果希望学习更多有关XQuery的知识,请访问菜鸟教程的《XQuery 教程》。

  • XLink 和 XPointer

XML中的链接被分为两个部分:XLink和XPointer。

XLink和XPointer定义了在XML文档中创建超级链接的标准方法。

如果希望学习更多有关XLink和XPointer的知识,请访问菜鸟教程的《XLink 教程和 XPointer教程》。

📎 参考文章

  • XPath 攻略:从入门到精通,告别查找困难
  • 学爬虫利器XPath,看这一篇就够了
  • XPath 教程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/435685.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

桥接模式和NET模式的区别

桥接模式和NET模式的区别 NAT模式&#xff1a; NAT&#xff1a;网络地址转换&#xff08;模式&#xff09;&#xff1a;借助宿主机来上网&#xff0c;没桥接那么麻烦&#xff0c;只用配置DNS即可。 缺点&#xff1a;扎根于宿主机&#xff0c;不能和局域网内其它真实的主机进行…

Commons-io工具包

FileUtils类&#xff08;文件/文件夹相关&#xff09; IOUtils类 Commons IO – 下载 Apache Commons IO 解压缩 将第一个jar包放入到项目的lib文件夹中 加入到项目之后&#xff0c;需要关联上&#xff0c;在关联上之后就可以打开看见里面写的文件了。

三篇文章速通JavaSE到SpringBoot框架 (中) IO 进程线程 网络编程 XML MySQL JDBC相关概念与演示代码

文章目录 IOfile类的作用I/O的作用将上篇文章综合项目使用IO流升级所需知识点 进程 线程创建线程的三种方式 网络编程网络编程介绍IP地址端口号网络通信协议网络通信协议的分层演示代码 XMLXML的作用是什么&#xff1f;xml特点 注解什么是注解&#xff1f;注解的使用注解的重要…

64.【C语言】再议结构体(下)

本文衔接第63篇63.【C语言】再议结构体(上) 目录 目录 6.复习 7.修改默认对齐数 8.结构体传参 01.传递非指针参数 02.传递指针参数(传递地址) 03.对比 9.结构体实现位段 01.位段的定义 02.格式 03.例题 答案速查 分析 10.位段跨平台问题 11.位段的应用 12.其他…

springboot+satoken实现刷新token(值变化)

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 &#x1f38f;&#xff1a;你只管努力&#xff0c;剩下的交给时间 &#x1f3e0; &#xff1a;小破站 springbootsatoken实现刷新token satoken是什么&#xff1f;支持什么&#xff1f;为什么需要&…

Word样式的同步与重置

有时候我们需要修改Word中的样式&#xff0c;实现排版的个性化。 如何同步样式到其他电脑上&#xff1f; Word中的样式是由Normal.dotm文件控制的&#xff0c;对样式所有的设置和修改&#xff0c;都会保存到这个问题件中&#xff0c;所以我们只需要在设置好样式以后&#xff…

springboot整合sentinel和对feign熔断降级

一、准备 docker安装好sentinel-dashboard&#xff08;sentinel控制台&#xff09;&#xff0c;参考docker安装好各个组件的命令启动sentinel-dashboard&#xff0c;我的虚拟机ip为192.168.200.131&#xff0c;sentinel-dashboard的端口为8858 二、整合sentinel的主要工作 在…

[Docker学习笔记]Docker的原理Docker常见命令

文章目录 什么是DockerDocker的优势Docker的原理Docker 的安装Docker 的 namespaces Docker的常见命令docker version:查看版本信息docker info 查看docker详细信息我们关注的信息 docker search:镜像搜索docker pull:镜像拉取到本地docker push:推送本地镜像到镜像仓库docker …

恋爱辅助应用小程序app开发之广告策略

恋爱话术小程序带流量主广告开启&#xff0c;是一个有效的盈利模式&#xff0c;可以增加小程序的收入来源。以下是对此的详细分析 一、流量主广告的定义与优势 流量主广告是指在小程序中嵌入广告位&#xff0c;通过展示广告内容来获取广告主的付费。对于恋爱话术小程序而言&am…

胤娲科技:AI界的超级充电宝——忆阻器如何让LLM告别电量焦虑

当AI遇上“记忆橡皮擦”&#xff0c;电量不再是问题&#xff01; 嘿&#xff0c;朋友们&#xff0c;你们是否曾经因为手机电量不足而焦虑得像个无头苍蝇&#xff1f;想象一下&#xff0c;如果这种“电量焦虑”也蔓延到了AI界&#xff0c; 特别是那些聪明绝顶但“耗电如喝水”的…

yolov8环境安装

yolov8 git地址 https://github.com/ultralytics/ultralytics/tree/main 我的电脑显卡配置 nvidia-smi cuda11.8下载 https://developer.nvidia.com/cuda-11-8-0-download-archive?target_osWindows&target_archx86_64&target_version10&target_typeexe_local …

Arthas perfcounter(查看当前 JVM 的 Perf Counter 信息)

文章目录 二、命令列表2.1 jvm相关命令2.1.13 perfcounter&#xff08;查看当前 JVM 的 Perf Counter 信息&#xff09;举例1&#xff1a;查看当前 JVM 的 Perf Counter 信息举例2&#xff1a;可以用-d参数打印更多信息 本人其他相关文章链接 二、命令列表 2.1 jvm相关命令 2…

ArcGIS与ArcGIS Pro去除在线地图服务名单

我们之前给大家分享了很多在线地图集&#xff0c;有些地图集会带有制作者信息&#xff0c;在布局制图的时候会带上信息影响出图美观。 一套GIS图源集搞定&#xff01;清新规划底图、影像图、境界、海洋、地形阴影图、导航图 比如ArcGIS&#xff1a; 比如ArcGIS Pro&#xff1a…

vue基于Spring Boot框架的高校实验室预约管理系统

目录 毕设制作流程功能和技术介绍系统实现截图开发核心技术介绍&#xff1a;使用说明开发步骤编译运行代码执行流程核心代码部分展示可行性分析软件测试详细视频演示源码获取 毕设制作流程 &#xff08;1&#xff09;与指导老师确定系统主要功能&#xff1b; &#xff08;2&am…

万字长文,解读大模型技术原理(非常详细)零基础入门到精通,收藏这一篇就够了

大模型是指具有大规模参数和复杂计算结构的机器学习模型。 本文从大模型的发展历程出发&#xff0c;对大模型领域的各个技术细节进行详细解读&#xff0c;供大家在了解大模型基本知识的过程中起到一定参考作用。 一、大模型的定义 大语言模型作为一个被验证可行的方向&#x…

什么是氧化镧

氧化镧是由氧和镧元素组成的化合物&#xff0c;化学式为La₂O₃。它是一种白色固体粉末&#xff0c;常见于镧系元素的氧化物中。其特性如下&#xff1a; 一、物理特性&#xff1a; 外观&#xff1a;氧化镧是一种白色或略带黄色的粉末&#xff0c;无臭无味。熔点&#xff1a;熔…

Docker面试-24年

1、Docker 是什么&#xff1f; Docker一个开源的应用容器引擎&#xff0c;是实现容器技术的一种工具&#xff0c;让开发者可以打包他们的应用以及环境到一个镜像中&#xff0c;可以快速的发布到任何流行的操作系统上。 2、Docker的三大核心是什么? 镜像&#xff1a;Docker的…

Cursor第一次体验

The AI Code Editor—Cursor 初体验 1.初闻 openAI ChatGPT 这个词相信大家都不陌生&#xff0c;作为AI界的顶流&#xff0c;ChatGPT 在2023年可谓是火遍全球&#xff0c;作为程序员&#xff0c;我们当然要紧跟时代的步伐&#xff0c;体验体验这个AI界的顶流。 同时作为生成式…

爬虫入门之爬虫原理以及请求响应

爬虫入门之爬虫原理以及请求响应 爬虫需要用到的库, 叫requests. 在导入requests库之前, 需要安装它, 打开cmd: 输入pip install 库名 pip install requests后面出现successful或requirement already就说明已经下载成功了!!! 下载出现的问题: 1.有报错或者是下载慢 修改镜像…

系统架构设计师-知识产权与标准化

目录 一、保护范围与对象 二、保护期限 三、知识产权人确定 四、侵权判断 五、标准化 一、保护范围与对象 知识产权是权利人依法就下列课题享有的专有权利&#xff1a; &#xff08;一&#xff09;作品&#xff08;著作&#xff09; &#xff08;二&#xff09;发明、实用…