xpath 相关问题

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

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

Java:无效选择器:指定了无效或非法的选择器

我正在尝试单击付款弹出窗口上的一个元素: 卡号: 我正在尝试单击付款弹出窗口中的一个元素: <label data-v-533987c6="" xpath="1">Card Number:</label> <input data-v-533987c6="" type="tel" data-mask="#### #### #### ####" data-previous-value="" xpath="1"> 具有以下 xPath: @FindBy(name = "//div[contains(@class,'buy-tickets')]//div/label[text()='Card Number:']/following-sibling::input") 但我收到此错误: org.openqa.selenium.InvalidSelectorException: invalid selector: An invalid or illegal selector was specified (Session info: chrome=80.0.3987.87) For documentation on this error, please visit: https://www.seleniumhq.org/exceptions/invalid_selector_exception.html Build info: version: '3.141.59', revision: 'e82be7d358', time: '2018-11-14T08:17:03' System info: host: 'DESKTOP-VQ56FMV', ip: '192.168.0.13', os.name: 'Windows 10', os.arch: 'amd64', os.version: '10.0', java.version: '1.8.0_231' Driver info: org.openqa.selenium.remote.RemoteWebDriver Capabilities {acceptInsecureCerts: false, browserName: chrome, browserVersion: 80.0.3987.87, chrome: {chromedriverVersion: 80.0.3987.106 (f68069574609..., userDataDir: C:\Users\Nastya\AppData\Loc...}, goog:chromeOptions: {debuggerAddress: localhost:64958}, javascriptEnabled: true, networkConnectionEnabled: false, pageLoadStrategy: normal, platform: WINDOWS, platformName: WINDOWS, proxy: Proxy(), setWindowRect: true, strictFileInteractability: false, timeouts: {implicit: 0, pageLoad: 300000, script: 30000}, unhandledPromptBehavior: dismiss and notify, webdriver.remote.sessionid: 3ca3f388f2b3cf47642733a6f03...} Session ID: 3ca3f388f2b3cf47642733a6f0383c1e *** Element info: {Using=name, value=//div[contains(@class,'buy-tickets')]//div/label[text()='Card Number:']/following-sibling::input} 为什么?希望你能帮助我! 根据错误信息 Element info: {Using=name, value=//div[contains(@class,'buy-tickets')]//div/label[text()='Card Number:']/following-sibling::input} 您正在尝试使用另一个 xpath //div[contains(@class,'buy-tickets')]//div/label[text()='Card Number:']/following-sibling::input` 与By.name,无效。您需要使用By.xpath。 错误消息正在自我解释 *** 元素信息:{Using=name, value=//div[contains(@class,'buy-tickets')]//div/label[text()='卡片 编号:']/以下兄弟姐妹::输入} 您正在使用 xpath 但选择器正在使用 name driver.findElement(By.xpath("//label[contains(text(),'Card Number')]/following-sibling::input")); 看来你们很亲近。虽然您在代码中提到了定位器策略为By.name,但是您传递的值: //label[text()='Expiration Date:']//following::input[@type='tel'][1] 类似于 xpath。因此,您需要使用 By.name 而不是使用 By.xpath,并且可以使用以下任一解决方案: xpath 1使用以下: driver.findElement(By.xpath("//label[text()='Card Number:']//following::input[1]")) xpath 2使用以下兄弟: driver.findElement(By.xpath("//label[text()='Card Number:']//following-sibling::input[1]")) 因为这个选择器是XPath 您可以通过 css、xpath、名称等查找元素 更换即可 @FindBy(name = "//div[contains(@class,'buy-tickets')]//div/label[text()='Card Number:']/following-sibling::input" 与 @FindBy(xpath = "//div[contains(@class,'buy-tickets')]//div/label[text()='Card Number:']/following-sibling::input"

回答 4 投票 0

Selenium、python、findelement、Xpath 方法无法定位或单击我页面上的元素

成功登录网站后,我无法在页面上定位元素。 我的目标是单击按钮来参与提议的活动。该按钮仅出现...

回答 1 投票 0

机器人框架无法获取定位器,我尝试复制 xpath,但仍然收到“无法找到定位器”错误

这是元素 我正在尝试使用 PyCharm 工具中的 Robot 框架、selenium 来自动化应用程序。 我尝试了关键字定义来单击名为“GCC Intelligence&

回答 1 投票 0

TRIM 不适用于 PostgreSQL 中 xpath 的行和选项卡?

通过此查询 选择修剪(标题)FROM( 选择 unnest( xpath('//p[@class="secTitle1"]', xmlText )::varchar[] ) AS 标题 从 t1 ) 作为 t2 以及带有线条和空格的 XML 输入文本...

回答 2 投票 0

XPath 使用超链接获取文本(Python)

我是 XPath 的新手(总的来说,我是 Python 的相对初学者)。我试图通过它从维基百科页面的第一段中取出文本。 以 Python 页面为例...

回答 2 投票 0

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