xpath 相关问题

XPath的主要目的是解决XML文档的各个部分。它还提供操纵弦乐,数字和布尔值的基本设施。 XPath使用紧凑的非XML语法。 XPath在XML文档的抽象逻辑结构上运行,而不是表面语法。

Nodejs Xpath 使用 xml-crypto 解析错误

我在使用 xml-crypto 库签署 xml 时遇到问题。 这是我的代码: const fs = require("fs"); const xmlCrypto = require("xml-crypto"); const xpath = 要求("

回答 1 投票 0

抓取我不想但不知道如何排除的链接

假设我有这个结构 假设我有这个结构 <div data-next="link0"> <a href="link1"/> <a href="link2"/> <a href="link3"/> <a href="link4"/> </div> 并且使用我的规则对象,我只想访问 link0,而不访问 link1、link2、link3、link4。 我怎样才能做到这一点? 我试过了 Rule(LinkExtractor(restrict_xpaths=('//div[@data-next]/@data-next')), callback='parse_item'), 但它不起作用,因为我需要对元素的引用,而不是直接的链接。但如果我删除@data-next,link1,link2,link3,link4也会被刮掉。 那么,有什么方法可以在这种情况下使用 Rule 对象来抓取 link0 吗? Rule(LinkExtractor(restrict_xpaths='//div[@data-next]', tags='div', attrs='data-next'), callback='parse_item'), 默认情况下,LinkExtractor 查找 <a> 标签和 @href attr。在这种情况下,您必须指定搜索中应包含哪些标签和属性。更多关于 Scrapy 文档 : 参数: (...) tags(str 或 list) – 提取链接时要考虑的标签或标签列表。默认为 ('a', 'area')。 attrs(列表)– 查找要提取的链接时应考虑的属性或属性列表(仅适用于在标签参数中指定的标签)。默认为 ('href',) 下面xpath //div[@data-next="link0]

回答 2 投票 0

如何使用 Selenium Web 驱动程序和 Python 来查找 div 数据元素

我需要使用 Selenium Web 驱动程序、Python 从此列表中选择“澳大利亚”。我尝试过 XPath 和 CSS 选择器,但无法正确定位该元素。 driver.find_element(By.XP...

回答 1 投票 0

带有 xpath 的 Html 单元未返回预期结果

我正在尝试使用 Html 单元使用谷歌搜索来筛选特定新闻报纸特定日期的热门新闻。我能够获得搜索结果,但是当我尝试访问...

回答 1 投票 0

Google 表格和加拿大银行 Valet API - 如何每月导入美元/加元数据

我设法在谷歌表格中使用 BoC Valet API 来获取特定时期内的每日美元加元汇率。 =importxml("https://www.bankofcanada.ca/valet/observations/FXCADUSD/xml?star...

回答 1 投票 0

Scrapy脚本,如何查找特定关键字并返回或打印url

好的,所以我必须完全编辑它。我已经让脚本部分工作,我可以毫无问题地启动它,这是脚本。粘贴链接在这里:http://pastebin.com/SKa5Wh1h 和...

回答 2 投票 0

如何匹配 XPath (lxml) 中元素的内容?

我想使用 XPath 表达式通过 lxml 解析 HTML。我的问题是匹配标签的内容: 例如给定 示例 元素我可以...

回答 2 投票 0

标记数据的 XPath?

我想读取第二个div内的数据: 每月: 0 / 30,000... 我想读取第二个div内的数据: <div class="my-3"> <div class="d-flex justify-content-between">Monthly:</div> <div>0 / 30,000</div> </div> 在上面的标记中,我想读取包含字符串的div:0 / 30,000 我能够使用此 XPath 导航到包含字符串 div 的第一个 "Monthly:": //*[normalize-space()='Monthly:'] 之后如何选择下面的第二个div? 使用这个: //*[normalize-space()='Monthly:']/following-sibling::div 当前接受的答案的局限性 当前接受的答案中的 XPath, //*[normalize-space()='Monthly:']/following-sibling::div 适用于OP的确切情况,其中目标标签后面有一个div, <div class="my-3"> <div class="d-flex justify-content-between">Monthly:</div> <div>0 / 30,000</div> </div> 但如果目标后面有多个 div 同级元素,可能会产生不同的结果。 例如,考虑以下标记: <div class="my-3"> <div class="d-flex justify-content-between">Monthly:</div> <div>0 / 30,000</div> <div>more</div> <div>and more</div> </div> 在这种情况下,不仅会选择 <div>0 / 30,000</div>,还会选择 <div>0 / 30,000</div> <div>more</div> <div>and more</div> 要仅选择 紧随其后的 div 元素,请改用此 XPath: //*[normalize-space()='Monthly:']/following-sibling::*[1][self::div] 要选择仅紧随任何名称的后续元素: //*[normalize-space()='Monthly:']/following-sibling::*[1]

回答 2 投票 0

如何获取类中的第二个div [XPATH]

我想读取第二个div内的数据: 在上面的屏幕截图中,我想读取包含字符串的 div:0 / 30,000 我能够导航到第一个包含...

回答 1 投票 0

find_elements_by_xpath 查找列表中未添加的现有元素

抱歉这个可怕的标题。我正在尝试从篮球参考网站创建球员列表(实际页面是 https://www.basketball-reference.com/teams/BOS/2024.html,在名册表中)...

回答 1 投票 0

Web 配置转换:如果不存在则插入

当且仅当目标中不存在匹配元素时,我想应用转换。使用 http://webconfigtransformationtester.apphb.com/ 尝试各种 xpath 表达式,但没有...

回答 4 投票 0

Selenium 和 Python 未找到元素,即使它们存在

我正在尝试以电子商务商店的格式自动化构建网站的重复过程(我是业余爱好者)。这些重复的步骤肯定会给我带来非凡的乐趣......

回答 1 投票 0

在电源自动化内部将 JSON 转换为数组时出错“无法处理行中操作“Compose_2”输入中的模板语言表达式

我有一个包含此内容的文件,我将文件内容解析为 JSON:- { “OOH.wu.2023.9.53”:{ “品牌”: ”***”, 「合约编号」:「喔...

回答 1 投票 0

连接xpath中的多个节点值

我有一个如下所示的 XML 你好 世界 我有一个如下所示的 XML <element1> <element2> <element3> <element4>Hello</element4> <element5>World</element5> </element3> <element3> <element4>Hello2</element4> <element5>World2</element5> </element3> <element3> <element4>Hello3</element4> <element5>World3</element5> </element3> </element2> </element1> 我正在尝试使用 Xpath 来获得这样的结果: Hello.World Hello2.World2 Hello3.World3 我使用了下面的 concat 函数,但没有得到正确的结果。 连接功能: concat(/element1/element2/element3/element4/text(),".", /element1/element2/element3/element5/text()) 我得到的结果: Hello.World 怎样才能得到正确的结果? 我正在使用 XPath 和 Camel Spring DSL。 编辑: XQuery、XSLT 和 SPel 中的解决方案也受到赞赏。 编辑 我尝试了字符串连接,但没有成功: 字符串连接函数: string-join((/element1/element2/element3/element4/text(), /element1/element2/element3/element5/text()),".") 我得到的结果: Hello.Hello2.Hello3.World.World2.World3 试试这个表达方式... string-join(//element3/(concat(element4/text(), '.', element5/text())), "&#10;") 我使用了 concat 方法,效果很好。 concat(//SomeElement/text(),'_',//OtherElement/text()) 这里有一个解决方案XSLT: <?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="//element3"> <xsl:value-of select="element4/text()" />.<xsl:value-of select="element5/text()" /> </xsl:template> </xsl:stylesheet> 使用XQuery: for $d in $doc/element2/element3 return fn:string-join(fn:data($d/element()), "."). $doc 存储 Xml。 如果您需要加入 xpath 选择的文本节点但无法使用 string-join(当您坚持使用 XSL 1.0 时),这可能会有所帮助: <xsl:variable name="x"> <xsl:apply-templates select="..." mode="string-join-mode"/> </xsl:variable> joined and normalized: <xsl:value-of select="normalize-space($x)"/> <xsl:template match="*" mode="string-join-mode"> <xsl:apply-templates mode="string-join-mode"/> </xsl:template> <xsl:template match="text()" mode="string-join-mode"> <xsl:value-of select="."/> </xsl:template> <xsl:template match="element3"> <xsl:value-of select="element4,element5" separator="."/> </xsl:template>

回答 6 投票 0

如何在XPath-1.0中进行集合运算?

我在 SO 和其他地方看到以下内容应该有效(这个示例直接来自 O'Reilly 的 XSLT Cookbook): (:交叉点:) $set1[计数(. | $set2) = 计数($set2)] (:

回答 2 投票 0

使用 aria-label 通过 Python3 和 Selenium 定位并单击元素

我想分别单击一个或多个,展开“随时”按钮。我尝试通过 class_name 和 xpath 来定位该元素。问题是类和 xpath 对于所有三个 'opt...

回答 3 投票 0

如何在 Cypress 中通过 TypeScript 项目使用 xpath 定位器?

最初,xpath 插件在我的 cypress 项目中运行良好。安装了 Typescript 插件并从 javascript 移至 Typescript。现在它开始在 xpath 上抛出错误 属性“xpath”d...

回答 2 投票 0

Javascript/JSON 获取给定子节点的路径?

如何获取对象给定子节点的 JSON 路径? 例如。: 变量数据 = { 键1:{ 孩子们: { key2: '值', key3: '值', 键4:{...} ...

回答 7 投票 0

动态下拉选择问题

尝试使用 Selenium Web 驱动程序在 Rahul Shetty Academy 网站上选择出发城市时,未选择使用 XPath 选择的出发城市。我的代码在星号下面...

回答 1 投票 0

xml节点限制显示

得到以下xml文件 史密斯 米尔顿 44 第五夏季街,MNTB 得到以下xml文件 <persns> <prsn> <fname>Smith</fname> <lname>Milton</lname> <age>44</age> <addrss>5th summer st, mntb</addrss> <city>Portland</city> </prsn> <prsn> <fname>Ken</fname> <lname>Jackson</lname> <age>37</age> <addrss>19th Penfield ave, brtcl</addrss> <city>Kelowna</city> </prsn> <prsn> <fname>Susan</fname> <lname>Arkland</lname> <age>48</age> <addrss>34th Mansfield st, sgtp</addrss> <city>Raleigh</city> </prsn> <prsn> <fname>George</fname> <lname>Bond</lname> <age>35</age> <addrss>5th drive, mntb</addrss> <city>Albany</city> </prsn> <prsn> <fname>Ron</fname> <lname>Davis</lname> <age>37</age> <addrss>12th Greenfield ave, brtcl</addrss> <city>Pheonix</city> </prsn> <prsn> <fname>Marie-Ann</fname> <lname>Spencer</lname> <age>48</age> <addrss>273 Simpson square</addrss> <city>Oklahoma</city> </prsn> <prsn> <fname>David</fname> <lname>Rhonson</lname> <age>45</age> <addrss>255 Lakeland Terrace, mi</addrss> <city>Livonia</city> </prsn> </persns> 并且,出于分页目的,需要将子节点显示限制为每页仅显示 3 个项目。 为此,必须有两个(或者可能是一个..)模板。 第一个,像这样 <xsl:variable name="frme" select="3" /> <xsl:template match ="persns"> <xsl:apply-templates select="prsn[position()mod$frme=1]"/> </xsl:template> 第二个,类似这样的东西(不起作用..) <xsl:template match="/prsn"> <!-- do some html table formatting and display those particular prsn's name, age etc --> </xsl:template> 因为只有第一个模板被实际触发并按顺序显示(几乎正确)所有 8 或 9 prsn 节点详细信息,所以第二个模板被简单地忽略(这是正确的)。 问题是如何假定格式一次显示有限数量的子节点及其子特征:年龄、地址、城市等。 已经问过此类问题,但是通过旧的 xslt 2 无框处理器,该工作解决方案对我来说不太有效。 我强烈需要这种解决方案,直到我切换 Saxon 处理器并设置前面提到的答案。 提前非常感谢您。 虽然有一些明显的延迟,但我会以某种方式展示这个堆叠数据(分页)显示的解决方案,就像几个月前最初在这里出现的那样。 也许有些人仍然对如何做到这一点感兴趣;尤其是这种“完整”的解决方案,人们几乎找不到......而且我真的知道我在说什么! 无论如何..这是另一个先前稍微修改过的(简化的)xml 文件: <persns> <prsn> <fname>Smith</fname> <lname>Milton</lname> <age>44</age> <addrss> <strt>5th summer st, mntb</strt> <zipcd>78455509</zipcd> <city>Portland</city> </addrss> </prsn> <prsn> <fname>Ken</fname> <lname>Jackson</lname> <age>37</age> <addrss> <strt>19th Penfield ave, brtcl</strt> <zipcd>872356223</zipcd> <city>Kelowna</city> </addrss> </prsn> <prsn> <fname>Susan</fname> <lname>Arkland</lname> <age>48</age> <addrss> <strt>34th Mansfield st, sgtp</strt> <zipcd>341289654</zipcd> <city>Raleigh</city> </addrss> </prsn> . . . . . <prsn> <fname>David</fname> <lname>Rhonson</lname> <age>45</age> <addrss> <strt>255 Lakeland Terrace, mi</strt> <zipcd>6000432217</zipcd> <city>Livonia</city> </addrss> </prsn> <prsn> <fname>Buddy</fname> <lname>Clark</lname> <age>53</age> <addrss> <strt>Lkeshore Lane Zion, il</strt> <zipcd>45230976521</zipcd> <city>Oneonta</city> </addrss> </prsn> <prsn> <fname>Peggy</fname> <lname>Johnson</lname> <age>42</age> <addrss> <strt>w.Devon ave. Monroe Township, nj</strt> <zipcd>3456872112</zipcd> <city>New Jersey</city> </addrss> </prsn> <prsn> <fname>Julie</fname> <lname>Nelson</lname> <age>35</age> <addrss> <strt>Wagon st.Springfield,pa</strt> <zipcd>76245127832</zipcd> <city>Pennsylvania</city> </addrss> </prsn> </persns> 通过我将进一步介绍的 xslt 转换,人们希望像通过以下图片展示的那样显示它(以及功能): 所以,xslt 变换如下所示: <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" html-version="5"/> <meta charset="UTF-8" name="viewport" content="width=device-width, height=device-height, initial-scale=1.1"/> <xsl:variable name="url" select="base-uri()"/> <xsl:param name="pag"> <xsl:choose> <xsl:when test="$url = substring-before(concat($url,'?'),'?')"> <xsl:value-of select="1"/> </xsl:when> <xsl:otherwise> <xsl:analyze-string select="$url" regex="[\?&amp;]([^=]+)=([^&amp;]+)"> <xsl:matching-substring> <xsl:value-of select="regex-group(2)"/> </xsl:matching-substring> </xsl:analyze-string> </xsl:otherwise> </xsl:choose> </xsl:param> <xsl:variable name="windw" select="3"/> <xsl:template match="persns"> <xsl:variable name="rcrds" select="count(persns/prsn)"/> <xsl:variable name="pags" select="ceiling(count(prsn) div $windw)"/> <xsl:variable name="start" select="($pag - 1)*$windw + 1"/> <xsl:variable name="lmt" select="prsn[position() ge $start and position() &lt; $start + $windw]"/> <table border="1" style="border-collapse:collapse"> <xsl:for-each select="$lmt[1]/*[not(self::addrss)]"> <xsl:variable name="i" select="position()"/> <tr><th><xsl:value-of select="name()"/></th> <xsl:for-each select="$lmt"> <td> <xsl:value-of select="*[$i]"/> <xsl:if test="$i mod 3=1"> <xsl:text> [</xsl:text> <xsl:element name="span"> <xsl:text>+</xsl:text> <xsl:attribute name="id"> <xsl:choose> <xsl:when test="position()mod3=1"> <xsl:text>cp1_rcrd01</xsl:text> </xsl:when> <xsl:when test="position()mod2=0"> <xsl:text>cp2_rcrd01</xsl:text> </xsl:when> <xsl:when test="position()mod3=0"> <xsl:text>cp3_rcrd01</xsl:text> </xsl:when> </xsl:choose> </xsl:attribute> <xsl:attribute name="class"> <xsl:text>cSsmbl_01</xsl:text> </xsl:attribute> <xsl:attribute name="onclick">fnct(this,'cpz1','cpz2','cpz3')</xsl:attribute> </xsl:element> <xsl:text>]</xsl:text> </xsl:if> </td> <th> <xsl:attribute name="class"> <xsl:choose> <xsl:when test="position()mod3=1"> <xsl:text>cpz1</xsl:text> </xsl:when> <xsl:when test="position()mod2=0"> <xsl:text>cpz2</xsl:text> </xsl:when> <xsl:when test="position()mod3=0"> <xsl:text>cpz3</xsl:text> </xsl:when> </xsl:choose> </xsl:attribute> <xsl:value-of select="addrss/*[$i]/name()"/> </th> <td> <xsl:attribute name="class"> <xsl:choose> <xsl:when test="position()mod3=1"> <xsl:text>cpz1</xsl:text> </xsl:when> <xsl:when test="position()mod2=0"> <xsl:text>cpz2</xsl:text> </xsl:when> <xsl:when test="position()mod3=0"> <xsl:text>cpz3</xsl:text> </xsl:when> </xsl:choose> </xsl:attribute> <xsl:value-of select="addrss/*[$i]"/> </td> </xsl:for-each> </tr> </xsl:for-each> </table> <!-- First/Prev link for pagination --> <xsl:choose> <xsl:when test="number($pag) ge 1"> &#160;<a id="pida" href="index.html?pag={number($pags)-number($pags)+1}" onclick="">&lt;&lt;First</a> &#160;<a id="pida" href="index.html?pag={number($pag)-1}" onclick="">&lt;Prev</a> </xsl:when> <xsl:otherwise> <!-- display smthing else --> &#160;<a><xsl:attribute name="href">index.html?pag=<xsl:value-of select="number($pag)"/></xsl:attribute>&lt;&lt;Prev</a> </xsl:otherwise> </xsl:choose> <xsl:if test="$pags gt 1"> &#160;<b><xsl:value-of select="number($pag)"/>&#160;/&#160;<xsl:value-of select="number($pags)"/></b>&#160; </xsl:if> <!-- Next/Last link for pagination --> <xsl:choose> <xsl:when test="number($pag) lt number($pags)"> &#160;<a id="nida" href="index.html?pag={number($pag)+1}">Next&gt;</a>&#160; <a id="nida" href="index.html?pag={number($pags)}" onclick="">Last&gt;&gt;</a> </xsl:when> <xsl:otherwise> <!-- display smthing else --> </xsl:otherwise> </xsl:choose> <!-- end of pgntn sect --> </xsl:template> </xsl:stylesheet> 但是,等等,有一个小的 .js 脚本实际上控制页面转换。 所以这个如下: function fnct(spn,cpz1,cpz2,cpz3) { setCcmpzt_01=document.getElementsByClassName(cpz1) /* 1'st hdr-col pair */ setCcmpzt_02=document.getElementsByClassName(cpz2) /* 2'nd hdr-col pair */ setCcmpzt_03=document.getElementsByClassName(cpz3) /* 3'rd hdr-col pair */ tblAtbCcpz=[setCcmpzt_01,setCcmpzt_02,setCcmpzt_03] if(spn.innerHTML=='+') { spn.innerHTML='-' switch(spn.id) { case 'cp1_rcrd01': for(j=0;j<tblAtbCcpz[0].length;j++) tblAtbCcpz[0][j].style.display="table-cell" break case 'cp2_rcrd01': for(j=0;j<tblAtbCcpz[1].length;j++) tblAtbCcpz[1][j].style.display="table-cell" break case 'cp3_rcrd01': for(j=0;j<tblAtbCcpz[2].length;j++) tblAtbCcpz[2][j].style.display="table-cell" break } } else { spn.innerHTML='+' switch(spn.id) { case 'cp1_rcrd01': for(j=0;j<tblAtbCcpz[0].length;j++) tblAtbCcpz[0][j].style.display="none" break case 'cp2_rcrd01': for(j=0;j<tblAtbCcpz[1].length;j++) tblAtbCcpz[1][j].style.display="none" break case 'cp3_rcrd01': for(j=0;j<tblAtbCcpz[2].length;j++) tblAtbCcpz[2][j].style.display="none" break } } } 最后,这是一个小的 .html 文件,其中所有文件都像这样“粘合”在一起: <html> <!-- xml stacked transposed persons (rows with columns) paged list display data along with some sub-records like 1-n relationship --> <head> <meta charset="UTF-8" name="viewport" content="width=device-width, height=device-height, initial-scale=1.2"/> <title>PeopleList</title> <script src="../frameless-xslt2.min.js"></script> <!-- prhps some other xslt prc --> <script type="text/javascript" src="js/scrpt1.js"></script> <link rel="stylesheet" href="css/stbl.css"/> </head> <body> <h2 style="margin-left:1.6cm">People List</h2> <script type="application/xslt+xml" data-input="xml/prsns.xml" src="xml/prs_style.xsl"></script> </body> </html> 这里还有一小块 .css: span:hover { cursor: pointer; } .cpz1, .cpz2, .cpz3 { display:none; } 所以..这就是全部。 不过有一些注意事项.. 首先,“不幸的是”使用的 xslt 处理器是......frameless.js (frameless.io);这个伟大的旧 xslt 处理器不再可供下载; 他们停止了这一伟大的发展,因此现在使用它会非常困难;选择这个的原因是它的有效性和简单性;不需要事先编译东西,像 saxonJS 那样的东西.. 不要声称是最好的答案,但这是一个可行的解决方案; 这种布局仅适用于没有足够空间的手机 水平展示室,这就是为什么选择垂直方法。 这里的一切实际上都是有效的,即使我没有提供一些可用的工作案例;还有一些涉及.js..并且有点困难;重点是这里描述的一切都正常! 感谢大家观看此内容,并最终希望得到其他回复。

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.