XPath的主要目的是解决XML文档的各个部分。它还提供操纵弦乐,数字和布尔值的基本设施。 XPath使用紧凑的非XML语法。 XPath在XML文档的抽象逻辑结构上运行,而不是表面语法。
我目前正在使用 Ruby 和 xPath 开发一个小型网络抓取项目。不幸的是,该网站的结构非常糟糕,这给我带来了一个小问题: 相关标题 我目前正在使用 Ruby 和 xPath 开发一个小型网络抓取项目。不幸的是,该网站的结构非常糟糕,这给我带来了一个小问题: <h3>Relevant Headline</h3> <p class="class_a class_b">Content starts in this paragraph...</p> <p class="class_a ">...but this content belongs to the preceding paragraph</p> <p class="class_a class_b">Content starts in this paragraph...</p> <p class="class_a ">...but this content belongs to the preceding paragraph</p> <h3>Some other Headline</h3> 如您所见,有 2 个 h3-Tags 框住了多个 p-tags。我希望选择所有带框的 p 标签。我已经找到了以下 xPath 来做到这一点: h3[contains(text(),"Relevant")]/following-sibling::p[1 = count(preceding-sibling::h3[1] | ../h3[contains(text(),"Relevant")])] 但现在困难来了:上面的两段是在一起的。 class_b 的段落(第一个)开始一个新的数据条目,下一个(第二个)属于该条目。 3和4是一样的。问题是:有时 3 个段落属于在一起,有时是 4 个段落,但大多数时候有一对段落属于在一起。 如何在 Ruby 中按组选择这些内部段落并将它们组合成一个字符串? 如果您不介意使用 xpath 和 nokogiri 的组合,您可以这样做: paragraph_text = Array.new doc.xpath('//p[preceding-sibling::h3[1][contains(text(), "Relevant")]]').each do |p| if p.attribute('class').text.include?('class_b') paragraph_text << p.content else paragraph_text[-1] += p.text end end puts paragraph_text #=> ["Content starts in this paragraph......but this content belongs to the preceding paragraph", "Content starts in this paragraph......but this content belongs to the preceding paragraph"] xpath 基本上用于获取段落标签。然后,使用 nokogiri/ruby 迭代段落并制定字符串。 可以用 xpath 来完成,但我认为用 slice_before 将它们分组更容易: doc.search('*').slice_before{|n| n.name == 'h3'}.each do |h3_group| h3_group.slice_before{|n| n[:class] && n[:class]['class_b']}.to_a[1..-1].each do |p_group| puts p_group.map(&:text) * ' ' end end 更新 使用 css 的另一个选项: doc.search('p.class_b').each do |p| str, next_node = p.text, p while next_node = next_node.at('+ p:not([class*=class_b])') str += " #{next_node.text}" end puts str end
rapidminer 可以从 URL 列表中提取 xpath,而不是先保存 HTML 页面吗?
我最近发现了RapidMiner,我对它的功能感到非常兴奋。但是我仍然不确定该程序是否可以帮助我满足我的特定需求。我希望程序能够抓取 xpath mat...
xf:dispatch:基于上下文节点的动态事件名称不起作用?
我正在尝试根据实例的内容定义一组按钮。 我这样做是为了通过将动作放入模型中来整理我的视图。 我正在使用调度元素来触发
我正在开发一个测试用例,该用例断言 Wiremock 存根的 xml 请求正文没有 xmlns 属性。 到目前为止,我尝试使用 equalToXml 匹配器,但这是忽略的
我正在编写一个 XPath 查询字符串来从 Windows 事件日志中选择记录,其中事件源包含特定字符串。我有一个版本可以执行完全匹配,其中路径 el...
我想获取 name 的值并使用 XMLLint 将其放入变量中 echo 'cat //body/value/@name' | xmllint --shell &...
需要查询 XPath,找到包含 7 个 <tr> 元素的所有 <td> 元素
您好,希望感谢您的帮助。 老实说,我对 XPath 的经验不是很丰富,我希望那里的专家能给我一个快速的答案。 我正在抓取网页以获取数据。定义...
我无法通过以下请求提取 Google 在搜索过程中找到的资源的链接(页面:https://google.com/search?q=example): //div[contains(@class, 'g')]//a[descendant::h3]/@href.
向端口发送消息时,Biztalk Server 中缺少根元素
我的场景看起来很简单: 我们有一个具有某种格式的文件 myfileddmmyyhhss.txt,在该文件中我们有这样的内容: H|3 |20110607235508 V|M006 |HAB8753 |纽约|PAS|201...
我正在使用 cy.get('xpath to selecter').type('something') 来填写一个工作正常的字段。 我遇到的问题是填写该字段应该启用继续按钮,但事实并非如此。如果我
如何使用动态值(示例 - 生成订单 ID)约束 div 容器以在 Selenium Java 运行时验证嵌套元素值?
订单详情页面 我有一个网页,生成的订单显示在列表中。我对订单详细信息部分有限制,其中包含新生成的订单 ID 并验证订单日期和
给定一个由一些链接组成的 HTML 文件的 URL。 (-)。 我想返回与给定子字符串匹配的@href-contents。 例如给定 HTML 代码 给定一个由一些链接组成的 HTML 文件的 URL。 (-)。 我想返回与给定子字符串匹配的@href-contents。 例如给定 HTML 代码 <html><body> <a href="https://stackoverflow.com/">secure link</a> <a href="http://google.com/">other link</a> </body></html> 我想要那些与“stack”匹配的链接。 我通过//a[contains(@href, "stack")]/@href做到这一点,什么有效。 但我想知道,为什么//a/@href[contains(text(),"stack")]不起作用,我更喜欢什么并且发现更符合逻辑。 我更愿意获取@href并返回那些匹配的,因为这似乎比查找所有a-标签更容易,其中包含与@href匹配的子字符串并返回@hrefs。 text()函数返回文本节点的值,在第二个示例中,您没有文本节点,而是属性节点,因此该函数解析为空。 如果想要对属性进行过滤,则需要获取属性值。看来 string() 在这种情况下可能会起作用: //a/@href[contains(string(),"stack")]
使用 Selenium C# 将值从不可知网格读取到列表<string>或数据表中
我正在尝试使用 selenium c# 读取网页上的不可知网格,并希望根据列名称存储文本。我不太喜欢 DataTable,所以我更喜欢 List 而不是 DT。 问题:这...
我正在尝试为下面的 HTML 编写 XPath。 我正在尝试为下面的 HTML 编写 XPath。 <div class="oxd-table-card" data-v-f2168256=""> <div class="oxd-table-row oxd-table-row--with-border" role="row" data-v-0d5ef602="" data-v-f2168256=""> <div class="oxd-table-cell oxd-padding-cell" role="cell" style="flex: 1 1 40%;"> <div data-v-6c07a142="">aaaaa Collings</div> </div> <div class="oxd-table-cell oxd-padding-cell" role="cell" style="flex: 1 1 40%;"> <div data-v-6c07a142="">2023-10-02 - 2023-10-08</div> </div> <div class="oxd-table-cell oxd-padding-cell" role="cell" style="flex: 1 1 20%;"> <div class="oxd-table-cell-actions" data-v-c423d1fa=""> <button type="button" class="oxd-button oxd-button--medium oxd-button--text oxd-table-cell-action-space" data-v-10d463b7="" data-v-c423d1fa=""> <!----> View <!----> </button> </div> </div> </div> </div> 我想要实现的目标: XPath 从获取文本开始 <div data-v-6c07a142>aaaaa Collings</div> 然后移至父标签 <div class="oxd-table-cell oxd-padding-cell" role="cell" style="flex: 1 1 40%;"> 然后移动到下一个同级并从中获取文本值 <div data-v-6c07a142>2023-10-02 - 2023-10-08</div> 网站:https://opensource-demo.orangehrmlive.com/web/index.php/auth/login 登录后,这是左侧菜单中的“时间”部分。我正在尝试获取时间模块中表的 XPath。 到目前为止我已经能够使用 XPath 获取文本 (//div[text()='aaaaa Collings']/parent::div/following-sibling::div)[1] 我想知道是否可以在不使用 XPath 中的索引的情况下获取文本。 我认为你的 XPath 没问题。这可能已经是最好的了。在这种情况下不需要索引,因为它是返回的第一个元素。你可以直接使用, //div[text()='aaaaa Collings']/parent::div/following-sibling::div 使用FindElement(单数),它将拉出第一个(所需的)元素。 我刚刚查看了您的网站。如果你想自动化测试,你可以获取表行中的所有数据,你可以使用Selenium方法FindElements //Locate Table IWebElement table = driver.FindElement(By.XPath("//div[@class='oxd-table']")); //Locate Rows using *FindElements* IList<IWebElement> rows = table.FindElements(By.XPath("//div[contains(@class, 'oxd-table-card')]")); 这样您将获得所有数据并使用 for 循环: foreach (var row in rows) { // Find all cells in the row IList<IWebElement> cells = row.FindElements(By.XPath(//div[contains(@class, 'oxd-table-row')])); // Create a list ***rowData*** to store row's data in cells and process // Extract text from each cell and add to rowData foreach (var cell in cells) { rowData.Add(cell.Text;)); // process data in list according to your needs... } }
如何使用presence_of_element_ located来单击复选框
我想使用这样的一段代码: elementspan = WebDriverWait(driver, 10).until(EC.presence_of_element_ located(("xpath", '//span[text()="" and @class="cb-i"]'))...
我有自动化测试脚本,它们在 Chrome 上运行良好。现在扩展了对 Edge 和 IE11 的支持。很少有测试脚本在 Edge 浏览器上失败。相同的定位器在 chrome 中工作正常...
在不太完美的 HTML 文档中使用 xmllint 和 xpath?
我有一个由现有工具生成的 HTML 页面 - 我无法更改此工具的输出。 但是,我想使用 xmllint 和 --xpath 选项来挑选一些特定的部分
我需要使用 xslt 替换字符 ' 和 "。我需要在 xml 文件中的整个文本中替换它们。' 字符应替换为 " 但仅限于表达式,在 ' 是 o 的一部分的情况下...
我正在尝试根据 标签及其值从这堆 XML 中提取 CVE-2011-3389 值。 如果 == cve,则从 获取 text() 值 我正在尝试根据 <reference> 标签及其值从这堆 XML 中提取 CVE-2011-3389 <type> 值。 如果<type> == cve,则从<reference>中获取text()值,如果不是,则跳过。 CVE 并不总是第 5 个节点,因此我无法使用节点计数来获得正确的节点。 <references> <reference> <type>other</type> <title/> <reference>CWE:327</reference> <description/> <url/> </reference> <reference> <type>other</type> <title/> <reference>https://example.com</reference> <description/> <url/> </reference> <reference> <type>other</type> <title/> <reference>327</reference> <description/> <url/> </reference> <reference> <type>bugtraq</type> <title/> <reference>49778</reference> <description/> <url/> </reference> <reference> <type>cve</type> <title/> <reference>CVE-2011-3389</reference> <description/> <url/> </reference> </references> 我已经使用 xidel 来尝试抓取这个,但到目前为止还没有成功。 我得到的最接近的是: //references[1]/reference[1]/reference[normalize-space(text()='CVE')[1] 打印出每个参考文献: CWE:327 https://example.com 327 49778 CVE-2011-3389 这个 xpath 得到了预期的值 //reference[type[.="cve"]]/reference/text() xmllint --xpath '//reference[type[.="cve"]]/reference/text()' tmp2.xml CVE-2011-3389
使用 Selenium 和 Python 抓取特定的 div
我有需要抓取的 HTML 代码 1.30 , 2.30 , 我有 HTML 代码,需要使用 Python 来抓取 <div class="odds ng-star-inserted"> 1.30 </div>、<div class="odds ng-star-inserted"> 2.30 </div>、<div class="odds ng-star-inserted"> 1.31 </div> 和 <div class="odds ng-star-inserted"> 2.31 </div> 值 1.30、2.30、1.31 和 2.31,但它们每行只返回 1.30 和 2.30。 结果需要是: 荷兰 韩国1.30 2.30 德国 日本1.31 2.31 但我明白: 荷兰 韩国1.30 2.30 德国 日本1.30 2.30 这是Python代码: teams = [] btts = [] odds_events = [] box = driver.find_element(By.XPATH, '//*[@id="page"]/div[2]') #Looking for 'sports titles' sport_title = box.find_element(By.CLASS_NAME, 'sport-name') parent = sport_title.find_element(By.XPATH, './..') grandparent = parent.find_element(By.XPATH, './..').find_element(By.XPATH, './..').find_element(By.XPATH, './..') single_row_events = grandparent.find_elements(By.CLASS_NAME, 'event') for match in single_row_events: odds_event = match.find_elements(By.CLASS_NAME, 'games') odds_events.append(odds_event) # Scrape teams for team in match.find_elements(By.CLASS_NAME, 'rivals'): teams.append(team.text) for odds_event in odds_events: for n, box in enumerate(odds_event): rows = box.find_elements(By.XPATH, '//div[@class="game g2 ng-star-inserted"]') if n == 0: btts.append(rows[0].text) 如果我设置 rows = box.find_elements(By.XPATH, './/*') 和 if n == 2: 显示错误 ValueError:所有数组的长度必须相同 但是如果我设置 if n == 0: 会给我很好的结果,但是对于 <div class="game g3 ng-star-inserted"> 所以在这种情况下结果是,但我不需要它。 荷兰 韩国1.10 2.10 3.10 德国 日本1.11 2.11 3.11 这是 HTML 代码: <div id="events"> <game-filter class="ng-star-inserted"> <div id="sport-legend" class="single"> <div class="sport-name"> Football </div> <div class="games g3"> <div class="game ng-star-inserted"> <div class="game-name"> KI </div> <div class="selections s3 ng-star-inserted"> <div class="selection ng-star-inserted"> Home </div> <div class="selection ng-star-inserted"> Away </div> </div> </div> <div class="game ng-star-inserted"> <div class="game-name"> UG </div> <div class="selections s3 ng-star-inserted"> <div class="selection ng-star-inserted"> Over </div> <div class="selection ng-star-inserted"> O/U </div> <div class="selection ng-star-inserted"> Under </div> </div> </div> <div class="game ng-star-inserted"> <div class="game-name"> BTTS </div> <div class="selections s2 ng-star-inserted"> <div class="selection ng-star-inserted"> GG </div> <div class="selection ng-star-inserted"> NG </div> </div> </div> </div> </div> </game-filter> <standard-item-info class="event ng-star-inserted"> <div class="details"> <div class="info"> <div class="time">01:01</div> <div class="date">01.01.</div> </div> <div class="rivals"> <div class="league"> <!----> <span class="time-special ng-star-inserted">VIRT 10' </span> EL </div> <div class="home"> Netherlands </div> <div class="away"> South Korea </div> </div> </div> <standard-item-games class="games g3 ng-star-inserted"> <div class="game g3 ng-star-inserted"> <div class="ng-star-inserted"> <standard-item-game class="ng-star-inserted"> <div class="odds ng-star-inserted"> 1.10 </div> </standard-item-game> <standard-item-game class="ng-star-inserted"> <div class="odds ng-star-inserted"> 2.10 </div> </standard-item-game> <standard-item-game class="ng-star-inserted"> <div class="odds ng-star-inserted"> 3.10 </div> </standard-item-game> </div> </div> <div class="game g2 g3 ng-star-inserted"> <div class="ng-star-inserted"> <standard-item-game class="ng-star-inserted"> <div class="odds ng-star-inserted"> 1.20 </div> </standard-item-game> <div class="odds limit ng-star-inserted"> 2.20 </div> <standard-item-game class="ng-star-inserted"> <div class="odds ng-star-inserted"> 3.20 </div> </standard-item-game> </div> </div> <div class="game g2 ng-star-inserted"> <div class="ng-star-inserted"> <standard-item-game class="ng-star-inserted"> <div class="odds ng-star-inserted"> 1.30 </div> </standard-item-game> <standard-item-game class="ng-star-inserted"> <div class="odds ng-star-inserted"> 2.30 </div> </standard-item-game> </div> </div> </standard-item-games> <div class="show-all-expand ng-star-inserted"> <div class="event-expand"> <div class="icon"></div> </div> </div> </standard-item-info> <standard-item-info class="event ng-star-inserted"> <div class="details"> <div class="info"> <div class="time">01:01</div> <div class="date">01.01.</div> </div> <div class="rivals"> <div class="league"> <!----> <span class="time-special ng-star-inserted">VIRT 10' </span> EL </div> <div class="home"> Germany </div> <div class="away"> Japan </div> </div> </div> <standard-item-games class="games g3 ng-star-inserted"> <div class="game g3 ng-star-inserted"> <div class="ng-star-inserted"> <standard-item-game class="ng-star-inserted"> <div class="odds ng-star-inserted"> 1.11 </div> </standard-item-game> <standard-item-game class="ng-star-inserted"> <div class="odds ng-star-inserted"> 2.11 </div> </standard-item-game> <standard-item-game class="ng-star-inserted"> <div class="odds ng-star-inserted"> 3.11 </div> </standard-item-game> </div> </div> <div class="game g2 g3 ng-star-inserted"> <div class="ng-star-inserted"> <standard-item-game class="ng-star-inserted"> <div class="odds ng-star-inserted"> 1.21 </div> </standard-item-game> <div class="odds limit ng-star-inserted"> 2.21 </div> <standard-item-game class="ng-star-inserted"> <div class="odds ng-star-inserted"> 3.21 </div> </standard-item-game> </div> </div> <div class="game g2 ng-star-inserted"> <div class="ng-star-inserted"> <standard-item-game class="ng-star-inserted"> <div class="odds ng-star-inserted"> 1.31 </div> </standard-item-game> <standard-item-game class="ng-star-inserted"> <div class="odds ng-star-inserted"> 2.31 </div> </standard-item-game> </div> </div> </standard-item-games> <div class="show-all-expand ng-star-inserted"> <div class="event-expand"> <div class="icon"></div> </div> </div> </standard-item-info> </div> </div>``` 一个解决方案: teamsdiv = driver.find_elements_by_xpath ("//div[@id='events']//div[@class='home' or @class='away']") notesdiv = driver.find_elements_by_xpath ("//div[@id='events']//standard-item-games") teams = [] for i in range(0, len(teamsdiv), 2): teams.append([teamsdiv[i].text, teamsdiv[i+1].text]) notes = [] for i in range(len(notesdiv)): notes.append(notesdiv[i].text.split('\n')[-2:]) for i in range(len(notes)): print(teams[i], notes[i]) 结果: ['Netherlands', 'South Korea'] ['1.30', '2.30'] ['Germany', 'Japan'] ['1.31', '2.31']