xpath 相关问题

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

无条件停止在指定元素(或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

如何用括号组合两个XPath表达式?

我需要组合两个 XPath 表达式,第二个是第一个的子表达式。理想情况下我会这样做: (//nav[@class='header__nav'])(/button|/div) 但这不起作用。 我知道我可以做到“事实上...

回答 2 投票 0

如何用括号组合2个xpath表达式

我需要组合 2 个 xpath 表达式,第二个是第一个的子表达式。理想情况下我会这样做: (//nav[@class='header__nav'])(/button|/div) 但这不起作用。 我知道我可以“事实上”...

回答 2 投票 0

抓取谷歌DOMNodelist始终为空

我想抓取谷歌搜索结果来收集 IMDB url。每次我使用 //ol[@id="rso"]//li[@class="g"] 进行 xpath 查询时,DOMNodelist 都是空的,没有返回任何内容。使用 var_dump 进行调试...

回答 1 投票 0

XSLT 三元“If”运算符?

我正在使用 XSLT 和 XML 来生成输出文档。 我的数据(以 XML 形式,我无法控制)如下: ...

回答 5 投票 0

Selenium Webdriver 无法找到类

我需要从此元素的类中检索子元素: 我需要从此元素的类中检索子元素: <td data-automation-id="horse-racing-section-row-1-meeting-cell" class="meetingCellDesktopMediumAbove_femjjxq"> 这些是上面元素的子元素: <a href="/horse-racing/australia-nz/ballarat"> <div class="meetingCellInternalContainerAbove_fyg3mg0"> <div class="leftCellContainer_frjo067"> <span class="size14_f7opyze medium_f1wf24vo meetingName_f1jzu4qi" data-automation-id="horse-racing-section-row-1-meeting-name">Ballarat</span> 我已经使用了所有这些方法来尝试找到它: races = driver.find_elements(By.XPATH, "//td[@class, 'meetingCellDesktopMediumAbove_femjjxq']") races = driver.find_elements(By.XPATH, "//td[contains(@class, 'meetingCellDesktopMediumAbove_femjjxq')]") races = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//td[contains(@class, 'meetingCellDesktopMediumAbove_femjjxq')]"))) races = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, "//td[contains(@class, 'meetingCellDesktopMediumAbove_femjjxq')]"))) races = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, "//td[@class, 'meetingCellDesktopMediumAbove_femjjxq']"))) races = driver.execute_script('return document.querySelectorAll("td.meetingCellDesktopMediumAbove_femjjxq")') races = driver.find_elements(By.CSS_SELECTOR, 'meetingCellDesktopMediumAbove_femjjxq') races = WebDriverWait(driver, 10).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, 'td.meetingCellDesktopMediumAbove_femjjxq'))) 当我尝试时: for race in races: print(race.text) 它什么也不返回。 错误方式://td[@class, 'meetingCellDesktopMediumAbove_femjjxq'] 正确://td[@class='meetingCellDesktopMediumAbove_femjjxq'] 如果你使用 contains(),最好把“_femjjxq”部分剪掉://td[contains(@class, 'meetingCellDesktopMediumAbove')]

回答 1 投票 0

如何列出“子”节点的所有属性(在本例中为“名称”和“id”,并在循环中获取它们的值以单独捕获?

child2_Parent_1 child4_Parent_1 <Children name='Children'> <child name='Child_2' id='2'>child2_Parent_1</child> <child name='Child_4' id='4'>child4_Parent_1</child> <child name='Child_1' id='3'>child1_Parent_1</child> <child name='Child_3' id='1'>child3_Parent_1</child> </Children> <Children name='Children'> <child name='Child_1' id='8'>child1_parent2</child> <child name='Child_2' id='7'>child2_parent2</child> <child name='Child_4' id='6'>child4_parent2</child> <child name='Child_3' id='5'>child3_parent2</child> </Children> 我看到的所有其他帖子都显示获取特定命名节点属性的值。我想动态获取节点的属性名称(我可能不知道)并获取值。任何帮助将不胜感激。 这实际上取决于 XML,在这种情况下,要获取所有 child 节点,您可以使用 XPath //child 然后获取属性,您可以从 .Attributes 获取它们,假设您提前不知道它们,例如,如果您想从这些示例 XML 动态构造一个对象: $xml = [xml] @' <Children name='Children'> <child name='Child_2' id='2'>child2_Parent_1</child> <child name='Child_4' id='4'>child4_Parent_1</child> <child name='Child_1' id='3'>child1_Parent_1</child> <child name='Child_3' id='1'>child3_Parent_1</child> </Children> '@ 你可以这样处理: $xml.SelectNodes('//child') | ForEach-Object { $obj = [ordered]@{} foreach ($attribute in $_.Attributes) { $obj[$attribute.Name] = $attribute.Value } $obj['InnerText'] = $_.InnerText [pscustomobject] $obj } 结果是: name id InnerText ---- -- --------- Child_2 2 child2_Parent_1 Child_4 4 child4_Parent_1 Child_1 3 child1_Parent_1 Child_3 1 child3_Parent_1

回答 1 投票 0

如何在 TypeScript 中使用 xml-crypto 在 XML 签名中添加对 KeyInfo 的引用?

我正在开发一个项目,使用 TypeScript 中的 xml-crypto 包来签署 XML 文档。我的目标是对 XML 进行签名并在同一签名中包含对 KeyInfo 元素的引用。 这里'...

回答 1 投票 0

XForms 刷新不起作用? (XSLTForms 1.7)

我需要从 Javascript 内部更改 XForms 实例数据。 对 XML 的实际修改似乎有效 - 但 UI 没有更新 - 尽管我明确刷新了 XForms - 我尝试了这两种方法...

回答 1 投票 0

Selenium 通过 XPath 查找元素

我有三个具有相同按钮类和跨度类名称的元素。我想使用 xpath 来选择第二个跨度类,但我总是出错。 我用过: browser.find_element(By.XPATH, "...

回答 1 投票 0

当前节点上方祖先的后代的 XPATH

<oc-resume-upload> <div data-test="resume-upload-container" class="form-section"> <div class="flex flex-column"> <h2 class="form-section-header form-section-header--required"> **Resume **</h2> <div> <div> <div ocappdrag="" class="dropzone dropzone-upload"> <oc-file-upload-button _nghost-ng-c1329912542=""> <div _ngcontent-ng-c1329912542=""> **<button _ngcontent**-ng-c1329912542="" type="button" data-test="resume-upload" aria-label="Upload resume" class="padding--m button button--clean"> <span class="font-size--s font--bold"> <strong>Select file</strong>, or drop file here </span> </button> 所以基本上我当前的节点是 button _ ngcontent 并且我想找到他的祖先或祖先的孩子中可用的第一个内容(以文本类型)。在这种情况下,我想要包含“Resume”作为内容的 h2 标签的文本。 './ancestor::*[normalize-space(.//*)][1]' 此代码允许在祖先或祖先的任何后代中查找文本,但问题是,它也找到我的后代。因此,我从我不想要的标签中得到“选择文件”。 ./ancestor::*[normalize-space(string(.)) and not(self::*) and not(.//*)][1] 应该是有效的,因为我排除了我的节点和我的节点后代,但在这种情况下我没有找到任何东西...... h2 不是祖先;也许可以尝试preceding::... ./preceding::*[text()[normalize-space()]][1] 我对 selenium 及其 xpath 支持不是很熟悉,而且你没有显示任何 python,所以我看不到你如何调用它,但上面是有效的 1.0 xpath。

回答 1 投票 0

xpath 通过文本内容找到 H3 元素,然后单击其父锚点

我们的搜索引擎已被替换,新引擎返回经过调整的 html 响应。我正在调整测试自动化,但我很难通过文本内容找到正确的 H3 元素,并且...

回答 1 投票 0

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