xpath 相关问题

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

嵌套 div 中的 xpath 问题

python/scrapy 新手。我正在控制台中通过 xpath 测试响应,并且能够使用下面的代码打印 h1 标头作为测试。现在我正在尝试选择 xpath 来提取 (1) 职位名称...

回答 1 投票 0

PHP - SimpleXMLElement 未使用名称空间正确解析

这是由API返回的: 这是由 API 返回的: <?xml version='1.0' encoding='utf-8'?> <entry xmlns="http://www.w3.org/2005/Atom" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xml:base="https://exmple.com/odata/"> <id>https://example.com/odata/PicklistOption(989L)</id> <title type="text" /> <updated>2015-09-03T11:56:51Z</updated> <author> <name /> </author> <link rel="edit" title="PicklistOption" href="PicklistOption(989L)" /> <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/childPicklistOptions" type="application/atom+xml;type=feed" title="childPicklistOptions" href="PicklistOption(989L)/childPicklistOptions" /> <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/parentPicklistOption" type="application/atom+xml;type=entry" title="parentPicklistOption" href="PicklistOption(989L)/parentPicklistOption" /> <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/picklistLabels" type="application/atom+xml;type=feed" title="picklistLabels" href="PicklistOption(989L)/picklistLabels" /> <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/picklist" type="application/atom+xml;type=entry" title="picklist" href="PicklistOption(989L)/picklist" /> <category term="SFOData.PicklistOption" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" /> <content type="application/xml"> <m:properties> <d:id m:type="Edm.Int64">989</d:id> <d:status>ACTIVE</d:status> <d:sortOrder m:type="Edm.Int32">229</d:sortOrder> <d:minValue m:type="Edm.Double">-1</d:minValue> <d:externalCode>PL</d:externalCode> <d:optionValue m:type="Edm.Double">-1</d:optionValue> <d:maxValue m:type="Edm.Double">-1</d:maxValue> </m:properties> </content> </entry> 现在正在努力获得<d:id> $xml = new SimpleXMLElement($xmlstr); $namespaces = $xml->getNameSpaces(true); $xml->registerXPathNamespace('m', $namespaces['m']); $xml->registerXPathNamespace('d', $namespaces['d']); $id = $xml->xpath('/entry/content/m:properties/d:id'); var_dump($id); 但我明白了array(0)。 不要从文档中获取命名空间。在您的应用程序中定义它们。命名空间是 xmlns/xmlns:* 属性的值。 xmlns 属性是默认命名空间。所以标签 entry 实际上是 {http://www.w3.org/2005/Atom}:entry。 命名空间必须是唯一的。为了避免冲突,大多数人使用 URL。 (其他人不太可能使用您的域来定义他们的命名空间。)这样做的缺点是命名空间是带有特殊字符的大字符串。这是通过使用命名空间前缀作为别名来解决的。 Xpath 没有默认的命名空间。您需要为您喜欢使用的每个命名空间注册一个前缀。 Xpath 引擎会将前缀解析为实际名称空间,并将其与节点解析的名称空间进行比较。 $xml = new SimpleXMLElement($xmlstr); $namespaces = [ 'a' => 'http://www.w3.org/2005/Atom', 'm' => 'http://schemas.microsoft.com/ado/2007/08/dataservices/metadata', 'd' => 'http://schemas.microsoft.com/ado/2007/08/dataservices', 'o' => 'https://exmple.com/odata/' ]; foreach ($namespaces as $prefix => $namespace) { $xml->registerXPathNamespace($prefix, $namespace); } $id = $xml->xpath('/a:entry/a:content/m:properties/d:id'); var_dump($id); 输出: array(1) { [0]=> object(SimpleXMLElement)#2 (0) { } } 您必须再次在每个 SimpleXMLElement 上注册 Xpath 命名空间。 这在 DOM 中更方便。 DOMXpath::evaluate() 执行 Xpath 表达式,并可以返回节点列表或标量,具体取决于表达式。 $document = new DOMDocument($xmlstr); $document->loadXml($xmlstr); $xpath = new DOMXpath($document); $namespaces = [ 'a' => 'http://www.w3.org/2005/Atom', 'm' => 'http://schemas.microsoft.com/ado/2007/08/dataservices/metadata', 'd' => 'http://schemas.microsoft.com/ado/2007/08/dataservices', 'o' => 'https://exmple.com/odata/' ]; foreach ($namespaces as $prefix => $namespace) { $xpath->registerNamespace($prefix, $namespace); } $id = $xpath->evaluate('string(/a:entry/a:content/m:properties/d:id)'); var_dump($id); 输出: string(3) "989" 这是如何通过节点元素方法完成的,例如 $xml->内容->属性->id ?

回答 2 投票 0

XPath - 如何从子节点中排除文本

我想要这个输出(示例): 我要这个 我正在处理 XML/TEI 文档,我需要使用 XPath 表达式,并且我希望将 div/u 中的文本作为输出,但没有节点 e 内的文本...

回答 2 投票 0

如何在body函数中分离freemarker中的XML标签

我正在尝试编写一个 freemarker 函数来解析 xml,但我想避免从 xml 中设置特定的 XPATH。 如果 xml 没有 DOCUMENT_SETS ,则以下 freemarker 可以正常工作。但是我的xml...

回答 1 投票 0

使用 XPath 查找具有特定名称的 td 的同级的问题

我正在尝试使用“XPath”从 XML 文件中获取“<"strong">”标签(“TGCTGCTGC”)之后的值。 查询“//dns:table/dns:tbody//dns:tr/...

回答 1 投票 0

Python 中支持 XPath 2.0 的库

是否可以在Python中使用XPath 2.0函数,例如starts-with()、ends-with()和contains()?我试图使用 lxml 和 defusedxml,但不幸的是它们不支持任何这些功能......

回答 3 投票 0

如何使用 Selenium + Python 根据另一个元素中包含的文本单击正确的链接?

我有一个像这样的html结构 我有一个像这样的html结构 <tbody> <tr role="row" class="odd"> <td class="text-center dtr-control"></td> <td class="text-center"> <a href="#" class="px-2 text-dark" onclick="bookPatient('1351','')"> <i class="fa-solid fa-pen-to-square cursor-pointer fa-lg"></i> <i class="fa-solid fa-pen-to-square cursor-pointer fa-lg"></i> </a> </td> <td>Dedeh</td> <td class="text-center">Female</td> <td class="text-center">07/02/1983</td> <td class style>PT MAJU JAYA</td> </tr> <tr role="row" class="odd"> <td class="text-center dtr-control"></td> <td class="text-center"> <a href="#" class="px-2 text-dark" onclick="bookPatient('1352','')"> <i class="fa-solid fa-pen-to-square cursor-pointer fa-lg"></i> <i class="fa-solid fa-pen-to-square cursor-pointer fa-lg"></i> </a> </td> <td>Mira</td> <td class="text-center">Female</td> <td class="text-center">17/10/2002</td> <td class style>PT MAJU JAYA</td> </tr> </tbody> 我期望 Selenium 在检查是否有相应的 <a> 值后单击 searched_text_bod 元素。当我尝试使用此代码时,输出始终无法识别 <a> 中的 <td> 元素。 该网站的元素上没有类或 ID,所以我遇到了困难。 searched_text_bod = "20/03/1990" # Improved XPath targeting based on confirmed structure base_xpath = "//tbody/tr[@role='row']" patient_row_xpath = f"{base_xpath}/td[text()='{searched_text_bod}']" try: # Find patient row containing the exact date of birth patient_link = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.XPATH, patient_row_xpath))) edit_patient_info = patient_link.find_element(By.XPATH, "/following-sibling::td/a") if patient_link: print(f"Found patient with date of birth: {searched_text_bod}") edit_patient_info.click( ) # Click on the 'a' element (assuming it's the link) else: print( f"Patient with date of birth '{searched_text_bod}' not found using DoB search" ) 当我需要创建一个有点复杂的自定义 XPath 时,我会经历一个过程,就像这个一样。我分步骤构建 XPath,验证每个步骤是否返回我想要的元素。我认为这比从头开始创建最终的 XPath,发现它不起作用,然后尝试排除故障更容易、更快。 目标是找到同时包含带有 DOB 的 TD 和我们要点击的 A 标签的 TR。这样我们就确保了 DOB 和链接位于同一表行中。 我做的第一件事就是找到包含 DOB 的 TD 元素 //tr/td[text()='17/10/2002'] 考虑到您现有的 XPath,您似乎可以控制这一步。现在这就是开始变得棘手的地方。 重新排列 XPath,使其返回 TR 而不是 TD //tr[./td[text()='17/10/2002']] 现在我们只需要从TR中找到A即可 //tr[./td[text()='17/10/2002']]/td/a 如果您还没有准备好,您想使用浏览器中的开发工具控制台来测试您的定位器。使用 $x() 作为 XPath,使用 $$() 作为 CSS 选择器。最终的 XPath 是 $x("//tr[./td[text()='17/10/2002']]/td/a") 有关 Chrome 开发工具的更多信息,请参阅文档。 从这里,我们可以更新代码... wait = WebDriverWait(driver, 10) searched_text_dob = "17/10/2002" links = wait.until(EC.visibility_of_all_elements_located((By.XPATH, f"//tr[./td[text()='{searched_text_dob}']]/td/a"))) if links: links[0].click() else: print(f"Patient with date of birth '{searched_text_dob}' not found using DoB search")

回答 1 投票 0

如何在 XPath 求值之前处理字符串中的双引号?

在下面的函数中,当 $keyword 中的字符串包含双引号时,它会创建一个“Warning: DOMXPath::evaluate(): Invalid expression”: $keyword = '这“导致”了错误'; $xPath->eva...

回答 3 投票 0

PHP DOMDocument 忽略第一个表的结束标记

我正在编写一个将 HTML 表格转换为 CSV 的工具,我注意到一些奇怪的行为。鉴于此代码 $html = << A玫瑰 我正在编写一个将 HTML 表格转换为 CSV 的工具,我注意到一些奇怪的行为。鉴于此代码 $html = <<<HTML <table> <tr><td>A</td><td>Rose</td></tr> </table> <h1>Leave me behind</h1> <table> <tr><td>By</td><td>Any</td></tr> </table> <table> <tr><td>Other</td><td>Name</td></tr> </table> HTML; $dom = new \DOMDocument(); \libxml_use_internal_errors(true); $dom->loadHTML($html, LIBXML_HTML_NODEFDTD | LIBXML_HTML_NOIMPLIED); \libxml_clear_errors(); $tables = $dom->getElementsByTagName('table'); $stream = \fopen('php://output', 'w+'); for ($i = 0; $i < $tables->length; ++$i) { $rows = $tables->item($i)->getElementsByTagName('tr'); for ($j = 0; $j < $rows->length; ++$j) { echo trim($rows->item($j)->nodeValue) . PHP_EOL; } } \fclose($stream); 我期望这样的输出: ARose ByAny OtherName 但是我得到的是这样的: ARose ByAny OtherName ByAny OtherName 如果省略第一个结束标签,我会得到相同的结果。看来 DOMDocument 将第二个和第三个 <table> 嵌套在第一个中。 事实上,如果我使用 xpath 仅从每个表中获取直接子项,我会得到正确的输出: $xpath = new \DOMXPath($dom); for ($i = 0; $i < $tables->length; ++$i) { $rows = $xpath->query('./tr', $tables->item($i)); for ($j = 0; $j < $rows->length; ++$j) { echo trim($rows->item($j)->nodeValue) . PHP_EOL; } } 您发布的第一个代码中的 DOMDocument 没有任何问题,它已经忠实地处理了您的 $html 请注意,您将循环遍历所有表,然后为每个表显示节点值 因此,如果您想知道实际发生了什么,请使用以下内容 <?php $html = <<<HTML <table> <tr><td>A</td><td>Rose</td></tr> </table> <h1>Leave me behind</h1> <table> <tr><td>By</td><td>Any</td></tr> </table> <table> <tr><td>Other</td><td>Name</td></tr> </table> HTML; $dom = new \DOMDocument(); \libxml_use_internal_errors(true); $dom->loadHTML($html, LIBXML_HTML_NODEFDTD | LIBXML_HTML_NOIMPLIED); \libxml_clear_errors(); $tables = $dom->getElementsByTagName('table'); $stream = \fopen('php://output', 'w+'); for ($i = 0; $i < $tables->length; ++$i) { $rows = $tables->item($i)->getElementsByTagName('tr'); echo "Now for table " . $i ."<br>" ; for ($j = 0; $j < $rows->length; ++$j) { echo trim($rows->item($j)->nodeValue) . "<br>"; } echo "<hr>"; } fclose($stream); ?>

回答 1 投票 0

Scrapy/跨多个 HTML 标签提取数据

Scrapy 新手,但追赶得很快。尽管有谷歌搜索和副驾驶,但我还是无法弄清楚一件事,所以我感谢您的耐心:)我有一些如下所示的 HTML: ... Scrapy 新手,但追赶得很快。尽管有谷歌搜索和副驾驶,但我还是无法弄清楚一件事,所以我感谢您的耐心:)我有一些如下所示的 HTML: <p> "The " <strong class="meep">cat</strong> " sat " <a href="whatever1" title="whatever2">on</a> " the mat." </p> 我去了div的父级p,并执行了: response.xpath('//div[@class="whatever3"]/p[2]/text()').extract() ...但它输出 ['The ', 'sat', ' the mat.'] 如何添加代码以获得“猫坐在垫子上。”?我也尝试过 following-sibling 语法,但就是无法让它工作。我也尝试过使用 join 但也无法让它发挥作用,在这里...... 欣赏想法。 要模仿所有文本节点值,只需使用 //text() response.xpath('//div[@class="whatever3"]/p[2]//text()').extract() join 方法会将字符串提取为由空格分隔的单个字符串。 ''.join(response.xpath('//div[@class="whatever3"]/p[2]//text()').extract())

回答 1 投票 0

字符串标记 xpath 表达式

我有下面的程序来标记 Xpath 表达式。但它无法处理这样的表达式: /员工/员工[秘密代码=a/b/c][unicode=d/e/f]/工资 基本上通过“/”中断进行标记

回答 1 投票 0

XSLT 从 xpath 变量返回多个值

定义了以下变量,用于传入正确的 ID,一个用于区域类代码,一个用于扇区类代码: 150050&...

回答 2 投票 0

xpath 使用 // 以及后代或自我和自我

我正在尝试获取与哈利·波特同年的所有书名 “/bookstore/book[year=//descendant-or-self::book[title='哈利·波特']/year]/title” 生成与

回答 1 投票 0

x从特定表中提取值的路径?

前段时间我成功制作了一个数据库,其中包含特定国家/地区销售的汽车数量。我从中提取数据的网站已更改,多个国家/地区的数据现在混合在同一页面上。

回答 1 投票 0

Python 抱怨 xpath 表达式无效

运行脚本时,我的 Xpath 定义出现以下错误。 selenium.common.exceptions.InvalidSelectorException:消息:给定的 xpath 表达式 ..... 无效:SyntaxEr...

回答 1 投票 0

在 TWIG 中转义简单引用

我正在使用这个 TWIG 查询: {% if xpath('md_file','//存档/DOSSIER_MDPH[包含("#FILENAME#", Identifiant)]') %}{{ xpath('md_file','//存档/DOSSIER_MDPH[包含("#文件名#",

回答 1 投票 0

如何返回 XML 节点的完整层次结构?

给出以下 XML 片段: 正确 <

回答 1 投票 0

如何检查页面上是否存在某些文本(puppeteer)

提前抱歉,如果我看起来有点无能,我昨天才开始使用 puppeteer,我对这种东西缺乏经验。 我正在尝试检查某个页面(用 puppeteer 打开)是否有

回答 2 投票 0

SaxonJS.XPath.evaluate( fn:transform() ) 的结果不返回根文档节点

对于 NodeJs 工具,我必须使用 XSLT 执行简单的 XML 转换。 我想使用 SaxonJs,但我不想参与整个 xslt3/sef 的事情(xslt 发生变化并且该工具需要 r...

回答 1 投票 0

访问 iframe 问题 - 用于自动化测试的 python selenium

我正在尝试访问以下 iframe: 但我尝试的所有操作都无法找到它,因此无法找到first_name_value 元素来与文本框交互并填充文本框。 两条路

回答 1 投票 0

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