xpath 相关问题

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

使用 rvest 从网页中提取表格

我正在尝试提取在此页面底部找到的表格。 我已经加载了 rvest 库并尝试了几个函数来尝试获取该表。即使用我

回答 1 投票 0

使用 XQuery/XPath 计算多个 XML 文件中的不同值

我有几个 XML 文件,它们都具有相同的结构。我需要找到每个元素中出现的所有不同值并对每个不同的出现次数进行计数。 这样做的最佳方法是什么...

回答 1 投票 0

使用 xmlstarlet 进行 XPath 查询

我有与此类似的 XML: 11111 我有与此类似的 XML: <orders> <orderCompleteRequestType> <Head> <Aufnr>11111</Aufnr> </Head> <Register> <Id>180</Id> <value1>11</value1> <value2>22</value2> </Register> <Register> <Id>181</Id> <value1>3</value1> <value2>43</value2> </Register> <Register> <Id>160</Id> <value1>5</value1> <value2>25</value2> </Register> </orderCompleteRequestType> <orderCompleteRequestType> <Head> <Aufnr>22222</Aufnr> </Head> <Register> <Id>280</Id> <value1>1</value1> <value2>12</value2> </Register> <Register> <Id>160</Id> <value1>12</value1> <value2>7</value2> </Register> <Register> <Id>281</Id> <value1>94</value1> <value2>22</value2> </Register> </orderCompleteRequestType> </orders> 我想从每个“orderCompleteRequestType”结构中选择 CSV 格式的一些值: 头/奥夫恩 注册/ID 寄存器/值1 寄存器/值2 使用以下命令行时: xmlstarlet sel -T -t -m "/orders/orderCompleteRequestType" -v "Head/Aufnr" -o ";" -v "Register/Id" -o ";" -v "Register/value1" -o ";" -v "Register/value2" -n -n test.xml 我得到: 11111;180 181 160;11 3 5;22 43 25 22222;280 160 281;1 12 94;12 7 22 所以,首先是 Register/Id 节点的所有值,接下来是所有 Register/value1,最后是所有 Register/value2,但我期望的是这样的: 11111;180;11;22 11111;181;3;43 11111;160;5;25 22222;280;1;12 22222;160;12;7 22222;281;94;22 任何人都可以帮助我,因为我的大脑拒绝工作...... 不要匹配 orderCompleteRequestType,而是考虑匹配 Register... xmlstarlet sel -T -t -m "/orders/orderCompleteRequestType/Register" -v "concat(../Head/Aufnr,';',Id,';',value1,';',value2)" -n test.xml 输出... 11111;180;11;22 11111;181;3;43 11111;160;5;25 22222;280;1;12 22222;160;12;7 22222;281;94;22 每个orderCompleteRequestType之间没有额外的换行符,但这也许没什么大不了的?如果是,那么编写 XSLT 并使用 xmlstarlet 调用它可能会更容易。

回答 1 投票 0

xmlstarlet 根据文本值选择同级

我一直在尝试用不同的选项来解决这个问题,但找不到正确的方法。 这是 xml 文件: <

回答 1 投票 0

编译的 XPath 查询的数据结构

编译的 XPath 查询通常使用什么样的数据结构?只是 AST 还是其他什么?如果是的话,DOM 中的搜索通常是如何实现的?这只是深度优先搜索吗

回答 1 投票 0

元素树python中带有属性的xpath表达式

导入 xml.etree.ElementTree 作为 ET 树:ET = ET.parse(文件) tree.find('.//ns1:tag/@someattribute', ns) 导致 {KeyError}'@',据我所知,xpath 表达式是正确的,是否有...

回答 1 投票 0

从一系列地图中获取不同的值

我想获取一系列地图并找到不同的值,显而易见的事情是。 我想获取一系列地图并找到不同的值,显而易见的事情是。 <xsl:variable name="sequence" select=" ( map { 'foo' : 1, 'bar' : () }, map { 'foo' : 1, 'bar' : '3' }, map { 'foo' : 1, 'bar' : '3' } )" as="map(xs:string,item()*)*"/> <xsl:variable name="distinct" select="distinct-values($sequence)"/> 但这引发了警告 Error in xsl:variable/@select on line 29 column 76 of PurchasableSeasonOG.content.xsl: FOTY0013 An atomic value is required for the first argument of fn:distinct-values(), but the supplied type is a map type, which cannot be atomized 即地图不是原子值,这很公平。 我期待答案是 ( map { 'foo' : 1, 'bar' : () }, map { 'foo' : 1, 'bar' : '3' } ) 但是你会怎么做呢? 附注 我可以看到如何使用硬编码的 for-each-group 来做到这一点,甚至构建一个递归函数来通过 for-each-group 来做到这一点,尽管我希望 XPath 工具箱中有东西可以做到这一点,并且我正在努力按可能是空序列的键进行分组。 deep-equal适用于地图,所以一种方法是 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.0" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="#all"> <xsl:variable name="sequence" select=" ( map { 'foo' : 1, 'bar' : () }, map { 'foo' : 1, 'bar' : '3' }, map { 'foo' : 1, 'bar' : '3' } )" as="map(xs:string,item()*)*"/> <xsl:output method="adaptive"/> <xsl:template match="/" name="xsl:initial-template"> <xsl:sequence select="fold-left($sequence, (), function($a, $m) { $a, $m[not(some $m2 in $a satisfies deep-equal($m, $m2))] })"/> </xsl:template> </xsl:stylesheet>

回答 1 投票 0

NoSuchElementException:没有这样的元素:无法找到元素

免责声明:十多年后我又重新开始编写脚本,因此对于这样一个基本问题提前表示歉意,但非常需要和感谢帮助。 我最近尝试寻找自动脚本...

回答 4 投票 0

如何忽略 Xpath 1.0 中的软连字符?

我正在尝试在 Selenium (Java) 中找到以下按钮: 我的按钮 元素r的innerHTML和innerText...

回答 1 投票 0

连接父节点和子节点的 Oracle BI Publisher Excel 模板

我有一个项目列表的主要数据集,其中包含“项目 ID”列和多个子集,用于每个项目的不同信息,其中包含“项目 ID”和“值...”

回答 3 投票 0

Selenium - 无法使用 xpath 找到元素

我正在用Python编写一个网络爬虫来获取产品列表的当前补丁版本。我试图通过 XPATH 查找文本,但被告知不存在这样的元素。我已经尝试过...

回答 1 投票 0

无条件停止在指定元素(或EOF)处抓取HTML

我正在使用 Python lxml.html 包来抓取 HTML 文件。 我试图抓取的 HTML 部分读取 DAB Ensemble 1 的描述我不关心的东西 我正在使用 Python lxml.html 包来抓取 HTML 文件。 我试图抓取的 HTML 部分读取 <h1>Description of DAB Ensemble 1</h1><table>Stuff I don't care about</table> <!-- Tags I don't care about --> <div id="announcement_data_block"> <h3>Announcement information</h3> <p>No announcement information is broadcast</p> </div> <!-- More tags I don't care about --> <h1>Description of DAB Ensemble 2</h1><table>Stuff I don't care about</table> <!-- Tags I don't care about --> <div id="announcement_data_block"> <h3>Announcement information</h3> <h4>Announcement switching (FIG0/19)</h4> <table>Stuff I DO care about</table> </div> <!-- More tags I don't are about --> 我对“公告切换”表感兴趣,对于给定的 DAB 整体,该表可能存在也可能不存在。我有一个lxml.hmtl.xpath表达式如下: f'//h1[text()="Description of DAB Ensemble {ens_idx}"]/following-sibling::table/following-sibling::div[@id="announcement_data_block"]/h4[starts-with(text(), "Announcement switching")]/following-sibling::table' 根据我的理解,这个 XPath 语句是说,对于给定的 ens_idx 值: 从根目录开始,找到文本匹配“Description of DAB Ensemble {ens_idx}”的 h1 标签(例如“Description of DAB Ensemble 1”、“Description of DAB Ensemble 2”),然后转到您看到的第一个表。 在上面的示例中,它将是标记为“我不关心的东西”的表。 然后,转到下一个 id 为“announcement_data_block”的 div。 在该 div 中,找到一个 h4 标签,其文本以“公告切换”开头。 获取接下来的第一个表。 在上面的示例中,DAB Ensemble 1 没有这样的表。 我希望 xpath 在尝试获取 DAB Ensemble 1 的表时返回 None 。但是,xpath 在遇到 h1 标签“DAB Ensemble 2 的描述”时不知道停止,因此它会继续运行,直到找到 DAB Ensemble 2的h4标签。 我正在寻求帮助,以找到一个 xpath 语句,该语句将使 XPath 无条件停止在下一个“DAB Ensemble 的描述”h1 标记处。本质上我希望将该指令修改为: 从根目录开始,找到文本匹配“Description of DAB Ensemble {ens_idx}”的 h1 标签(例如“Description of DAB Ensemble 1”、“Description of DAB Ensemble 2”),然后转到您看到的第一个表。 在上面的示例中,它将是标记为“我不关心的东西”的表。 然后,转到下一个 id 为“announcement_data_block”的 div。 在该 div 中,找到一个 h4 标签,其文本以“公告切换”开头。 获取随后的第一个表。 如果在文本匹配“Description of DAB Ensemble {ens_idx + 1}”或 EOF 的 h1 标记之前找不到此条件,则返回 None。 粗体部分是我的 XPath 表达式中缺少的部分。有谁知道如何构造这样的表达式? 从示例中可以看出,H1 和带有 id 的 div 都是兄弟姐妹,所以 搜索应表明找到的第一个 following::table 和第一个 @id="announcement_data_block" 是必需的,因为 f'//h1[text()="Description of DAB Ensemble {ens_idx}"]/following-sibling::table[1]/following-sibling::div[@id="announcement_data_block"][1]/h4[starts-with(text(), "Announcement switching")]/following-sibling::table' 顺便说一句:id 不应重复。

回答 1 投票 0

无条件停止抓取指定元素(或EOF)

我正在使用 Python lxml.html 包来抓取 HTML 文件。 我正在尝试抓取部分内容的 HTML DAB Ensemble 1 的描述我不关心的东西&... 我正在使用 Python lxml.html 包来抓取 HTML 文件。 我正在尝试抓取部分内容的 HTML <h1>Description of DAB Ensemble 1</h1><table>Stuff I don't care about</table> <!-- Tags I don't care about --> <div id="announcement_data_block"> <h3>Announcement information</h3> <p>No announcement information is broadcast</p> </div> <!-- More tags I don't care about --> <h1>Description of DAB Ensemble 2</h1><table>Stuff I don't care about</table> <!-- Tags I don't care about --> <div id="announcement_data_block"> <h3>Announcement information</h3> <h4>Announcement switching (FIG0/19)</h4> <table>Stuff I DO care about</table> </div> <!-- More tags I don't are about --> 我对“公告切换”表感兴趣,对于给定的 DAB 整体,该表可能存在也可能不存在。我有一个lxml.hmtl.xpath表达式如下: f'//h1[text()="Description of DAB Ensemble {ens_idx}"]/following-sibling::table/following-sibling::div[@id="announcement_data_block"]/h4[starts-with(text(), "Announcement switching")]/following-sibling::table' 根据我的理解,这个 XPath 语句是说,对于给定的 ens_idx 值: 从根目录开始,找到文本匹配“Description of DAB Ensemble {ens_idx}”的 h1 标签(例如“Description of DAB Ensemble 1”、“Description of DAB Ensemble 2”),然后转到您看到的第一个表。 在上面的示例中,它将是标记为“我不关心的东西”的表。 然后,转到下一个 id 为“announcement_data_block”的 div。 在该 div 中,找到一个 h4 标签,其文本以“公告切换”开头。 获取接下来的第一个表。 在上面的示例中,DAB Ensemble 1 没有这样的表。 我希望 xpath 在尝试获取 DAB Ensemble 1 的表时返回 None 。但是,xpath 在遇到 h1 标签“DAB Ensemble 2 的描述”时不知道停止,因此它会继续运行,直到找到 DAB Ensemble 2的h4标签。 我正在寻求帮助,以找到一个 xpath 语句,该语句将使 XPath 无条件停止在下一个“DAB Ensemble 的描述”h1 标记处。本质上我希望将该指令修改为: 从根目录开始,找到文本匹配“Description of DAB Ensemble {ens_idx}”的 h1 标签(例如“Description of DAB Ensemble 1”、“Description of DAB Ensemble 2”),然后转到您看到的第一个表。 在上面的示例中,它将是标记为“我不关心的东西”的表。 然后,转到下一个 id 为“announcement_data_block”的 div。 在该 div 中,找到一个 h4 标签,其文本以“公告切换”开头。 获取随后的第一个表。 如果在文本匹配“Description of DAB Ensemble {ens_idx + 1}”或 EOF 的 h1 标记之前找不到此条件,则返回 None。 粗体部分是我的 XPath 表达式中缺少的部分。有谁知道如何构造这样的表达式? 从示例中可以看出,H1 和带有 id 的 div 都是兄弟姐妹,所以 搜索应表明找到的第一个 following::table 和第一个 @id="announcement_data_block" 是必需的,因为 f'//h1[text()="Description of DAB Ensemble {ens_idx}"]/following-sibling::table[1]/following-sibling::div[@id="announcement_data_block"][1]/h4[starts-with(text(), "Announcement switching")]/following-sibling::table' 顺便说一句:id 不应重复。

回答 1 投票 0

CSS 选择器是否包含类似于 xpath 的文本?

在 Selenium 中,是否有任何带有“contains”的 CSS 选择器选项,类似于 Xpath,我们使用 contains[text(),....] 进行检查。 在下面的示例中,我给出了 CSS 和 Xpath &...

回答 3 投票 0

基于2个条件而不是在同一节点级别上选择xpath中的元素

更新: 我不知道使用以下结构过滤两个条件的语法。 我需要选择一个特定的 更新: 我不知道使用以下结构过滤两个条件的语法。 我需要在名为 <a class="_1ufH4" href="ELEMENT of INTEREST"> 的节点之一中选择一个特定的 <div class="_1rOLI _My0B"> 仅当满足以下两个条件时: <h2 class="_2MeiE">PARIS</h2> <div class="_16U2O typography-h220">20:30</div> <root> <div class="_13nA5"> <section role="none" class="_29N96"> <div class="SppyD"> <div class="_2Bl6B"> <img src="https://example" alt="" width="20" height="20"> </div> <h2 class="_2MeiE">LONDON</h2> </div> <div class="_26Fte"> <div class="_1rOLI _My0B"> <div class="_2VB9y"> <div class="_18IfB"> <div class="_3u6AO"> <a class="_1ufH4" href="ELEMENT of INTEREST"> <div class="_2AdVd"> <div class="Xi8qr"> <div class="_16U2O typography-h220">14:30</div> </div> </div> </a> </div> </div> </div> </div> <div class="_1rOLI _My0B"> <div class="_2VB9y"> <div class="_18IfB"> <div class="_3u6AO"> <a class="_1ufH4" href="ELEMENT of INTEREST"> <div class="_2AdVd"> <div class="Xi8qr"> <div class="_16U2O typography-h220">15:30 2</div> </div> </div> </a> </div> </div> </div> </div> </div> </div> </section> </div> <div class="_13nA5"> <section role="none" class="_29N96"> <div class="SppyD"> <div class="_2Bl6B"> <img src="https://example" alt="" width="20" height="20"> </div> <h2 class="_2MeiE">PARIS</h2> </div> <div class="_26Fte"> <div class="_1rOLI _My0B"> <div class="_2VB9y"> <div class="_18IfB"> <div class="_3u6AO"> <a class="_1ufH4" href="ELEMENT of INTEREST"> <div class="_2AdVd"> <div class="Xi8qr"> <div class="_16U2O typography-h220">20:30</div> </div> </div> </a> </div> </div> </div> </div> <div class="_1rOLI _My0B"> <div class="_2VB9y"> <div class="_18IfB"> <div class="_3u6AO"> <a class="_1ufH4" href="ELEMENT of INTEREST"> <div class="_2AdVd"> <div class="Xi8qr"> <div class="_16U2O typography-h220">16:30</div> </div> </div> </a> </div> </div> </div> </div> </div> </div> </section> </div> <root/> 我遇到过“前面的兄弟姐妹”,但我不知道如何根据我给你的两个条件的位置来选择感兴趣的元素。 如果我理解正确的话 //section[contains(.,"PARIS")]//a[@class="_1ufH4" and contains (.//div,"20:30")] 您可以进一步自定义第一个 contains 参数以获得更多独特性

回答 1 投票 0

用于提取图像源URL的XPath

我正在尝试检索与 .jpg 文件关联的 URL。 我在 Chrome 中使用了各种 XPath 和检查工具,但最终总是得到封装 URL 的结果。示例...

回答 4 投票 0

XPath 使用字符串分隔符连接所有结果节点

我想连接与表达式匹配的所有节点的值,并用逗号分隔它们。例如,以下 xml 应返回“num1,num2,num3” 我想连接与表达式匹配的所有节点的值,并用逗号分隔它们。例如,以下 xml 应返回“num1,num2,num3” <products> <product> <id>1</id> <other>y</other> <notarget>x</notarget> <target>num1</target> <target>num2</target> <target>num3</target> </product> </products> XPath /*[name()='products']/*[name()='product']/*[name()='target'] 应该获取元素,但我只是不明白如何加入它们。 如果没有宿主语言的帮助,这是无法在纯 XPath 1.0 中完成的。事实上,即使有宿主语言的帮助也很困难,因为 XPath 1.0 没有“字符串序列”的概念。 <xsl:value-of select="[set of nodes]" separator="."/> 我想做同样的事情并使用 XSLT 2.0 通过分隔符属性解决它 <xsl:for-each select="/products/product/target"> <xsl:if test="position() != 1">,</xsl:if><xsl:value-of select="text()"/> </xsl:for-each> 如果您想稍后重用它,可以将其放置在变量中: <xsl:variable name="concat"> <xsl:for-each select="products/product/target"> <xsl:if test="position() != 1">,</xsl:if><xsl:value-of select="text()"/> </xsl:for-each> </xsl:variable> <xsl:value-of select="$concat"/> 与撒克逊林特: saxon-lint --output-separator , --xpath '//target/text()' file 输出 num1,num2,num3 使用 concat 与分隔符(根据 https://stackoverflow.com/a/25766054/148889) concat(//SomeElement/text(),'_',//OtherElement/text()) 使用不带字符串连接的 XQuery 1.0, 您可以依靠 data() 来连接序列, 然后进行替换来控制(删除)它决定使用的任何分隔符, 以及一个子字符串,用于从第一项之前删除调整后的分隔符: substring(replace(data(<root>{for $v in //target return concat("<@>", $v)}</root>), " *<@> *", ","), 3) 请注意中间分隔符“<@>”,以避免与可能包含文字逗号的数据发生冲突。 当然,如果你确定你的数据不包含分隔符,你可以直接使用逗号。 (这是为那些像我一样在 10 年前一直使用 Oracle 11.2 的 XMLTable 进行操作的人准备的)

回答 6 投票 0

如何使用 XPath 从一个字符串中的多个元素返回文本?

我想使用 XPath 从specialList 列表中的所有 元素中提取所有文本,并返回一个以空格或逗号分隔的字符串。这可能吗? 可以说... 我想使用 XPath 从 <li> 列表中的所有 specialList 元素中提取所有文本,并返回一个以空格或逗号分隔的字符串。这可能吗? 假设 DOM 包含以下 HTML: <ul class="specialList"> <li>one</li> <li>two</li> <li>three</li> <li>four</li> </ul> 所需输出 one, two, three, four 或 one two three four 在 XPath 1.0 中,只有当您使用 concat(...): 提前知道元素数量时,这才有可能 concat(//li[1], ', ', //li[2], ', ', //li[3], ', ', //li[4]) 如果幸运的话,您可以返回 //li/text() 的所有结果字符串,并设置 XPath 处理器的输出参数以按照您的需要连接它们。这取决于处理器,因此没有通用的解决方案,如果您想在 XPath 中进一步处理结果,这是没有办法的。 在XPath 2.0中,您可以使用fn:string-join($sequence, $delemiter)输入任意长度: fn:string-join(//li, ', ') 尽管使用 XSLT 1.0 可以实现这一点 <xsl:for-each select="ul/li"> <xsl:value-of select="."/> <xsl:if test="position() != last()"> <xsl:text>,</xsl:text> </xsl:if> </xsl:for-each> 要完成 @jens-erat 的答案,使用 XQuery 1.0(不带字符串连接), data() 将连接您的序列, 一些替换将允许您控制(删除)它决定使用的任何分隔符, 并且子字符串将从第一项之前删除您调整的分隔符: substring(replace(data(<ul>{for $v in distinct-values(//li) return concat(", ",$v)}</ul>)," ,",","),3) (这是为那些像我一样在 10 年前一直使用 Oracle 11.2 的 XMLTable 进行操作的人准备的)

回答 3 投票 0

使用 XPATH 创建列表,但并非所有节点都可用

我确实有一些奇怪的 XML 我想分析: 名字 A

回答 1 投票 0

Symfony 爬虫获取带有以下兄弟的文本

给出以下 html 代码: 1.问题1 2.您有问题1 给出以下 html 代码: <div class="body"> 1. Question <strong>1</strong> <input type="text" /> 2. You have <u>Question</u><strong>1</strong> <input type="text" /> 3. Question <strong>3</strong> <input type="text" /> </div> 我想要得到这样的文字: [ 0 => 'Question 1', // Or 'Question <strong>1</strong>' is better 1 => 'You have Question 2', 2 => 'Question 3' ] 这是我的代码: $results = []; $questions = $crawler->filterXPath('//*[contains(@class, "body")]/text()[normalize-space()][following-sibling::input]'); $questions = $questions->each(function($c) use (&$results) { $line = trim($c->text()); if(preg_match('/^[0-9]{1,2}\./', $line, $matches) == true) { $number = $matches[0]; if(is_numeric($number) && $number != '') { $results[] = trim(str_replace($number, '', $line)); } } elseif(!empty($results)) { $results[count($results) - 1] .= '\n'. $line; } }); return $results; 无需 <strong> 和 <u> 标签即可正常工作。你到底该怎么做? 您可以使用 strip_tags($text) 从字符串中删除 html 在这里阅读相关内容http://www.w3schools.com/php/func_string_strip_tags.asp 如果你想删除起始数字,你可以使用explode() (http://php.net/manual/en/function.explode.php)就像 explode(' ', $line, 2) 注意末尾的“2”,这将生成 2 个元素的数组,第一个元素是数字 + 点,第二个元素是文本。

回答 1 投票 0

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