GVKun编程网logo

您如何使用 xpath 定位非标准 html 标签?(xpath定位a标签)

2

最近很多小伙伴都在问您如何使用xpath定位非标准html标签?和xpath定位a标签这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展C#和Xpath-在单个Xpath查询中使用节

最近很多小伙伴都在问您如何使用 xpath 定位非标准 html 标签?xpath定位a标签这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展C# 和 Xpath - 在单个 Xpath 查询中使用节点集和字符串类型返回结果、Cypress系列(98)- cypress-xpath 插件, xpath() 命令详解、lxml xpath() 函数不适用于正确的 XPath 查询、Puppeteer xpath 表达式失败,尽管 xpath 表达式有效等相关知识,下面开始了哦!

本文目录一览:

您如何使用 xpath 定位非标准 html 标签?(xpath定位a标签)

您如何使用 xpath 定位非标准 html 标签?(xpath定位a标签)

如何解决您如何使用 xpath 定位非标准 html 标签?

  1. $html = ''<g-review-stars><spanaria-label="Rated 4.7 out of 5," role="img"><span></span></span></g-review-stars>'';
  2. $doc = new DOMDocument;
  3. $doc->loadHTML($html);
  4. $xpath = new DOMXpath($doc);
  5. $node= $xpath->query(''//g-review-stars[]''
  6. )->item(0);
  7. $html = $node->ownerDocument->saveHTML($node); //
  8. print_r($html);

据我所知,没有办法做到这一点,所以我想知道是否有某种黑客攻击。问题是谷歌没有在包装 g-review-stars 的 div 标签中使用任何特定的 id,所以很难定位它。

  1. Warning: DOMDocument::loadHTML(): Tag g-review-stars invalid in Entity,line: 1
  2. in C:\\Sources\\modules\\test-pregmatch\\script.PHP on line 6
  3. Warning: DOMXPath::query(): Invalid expression in C:\\Sources\\modules\\test-pregma
  4. tch\\script.PHP on line 8
  5. Fatal error: Uncaught Error: Call to a member function item() on boolean in C:\\S
  6. ources\\modules\\test-pregmatch\\script.PHP:9

我希望以 html 节点 g-review-stars 为目标,我希望 ''<g-review-stars><spanaria-label="Rated 4.7 out of 5," role="img"><span></span></span></g-review-stars>'' 作为输出。

解决方法

应该这样做:

  1. $node= $xpath->query(''.//g-review-stars'');
  2. echo $doc->saveHTML($node[0]);

输出:

  1. <g-review-stars>
  2. <span class="Fam1ne EBe1af" aria-label="Rated 4.7 out of 5," role="img">
  3. <span style="width:63px">
  4. </span>
  5. </span>
  6. </g-review-stars>

C# 和 Xpath - 在单个 Xpath 查询中使用节点集和字符串类型返回结果

C# 和 Xpath - 在单个 Xpath 查询中使用节点集和字符串类型返回结果

如何解决C# 和 Xpath - 在单个 Xpath 查询中使用节点集和字符串类型返回结果

在项目中,我使用 Xpath 来抓取价格。在这种情况下,我可以有 2 个选项来获取下一个查询指定的价格:

  1. var xpath = @"substring-after(//div[@price''],":")|//span[@pln">oldPrice"]";

在 C# 代码中:

  1. HtmlDocument htmlDocument = new HtmlDocument();
  2. htmlDocument.LoadHtml(html);
  3. XPathNavigator navigator = document.DocumentNode.CreateNavigator();
  4. var eval = navigator.Evaluate(xpath); // here i get error: Expression must evaluate to a node-set.
  5. var expression = navigator.Compile(xpath); // and also here i get error: Expression must evaluate to a node-set.

我知道 substring-after(//div[@price''],":") 是字符串的返回类型。 并且 //span[@] 是 Node-Set 的返回类型

你有什么建议我应该如何处理这个案子?
a) 我是否应该拆分 xpath 并解析由“|”分隔的每个部分?
b) 或者有没有其他方法可以使用上面的组合 xpath 查询获得结果而不拆分字符串和检查每个部分?
c) 我是否错过了任何其他符合我要求的课程?

我希望有足够的上下文。

解决方法

联合运算符仅适用于节点集,因此您的表达式应该会失败,因为 LHS 是一个字符串(即使 //div 不选择任何内容,它也是一个字符串)。

您是否希望 //span[@] 返回单个节点?在这种情况下,您可以使用 string() 函数将其转换为字符串,然后使用 concat() 函数连接两个字符串。

考虑迁移到更高版本的 XPath,它允许您返回字符串序列。

Cypress系列(98)- cypress-xpath 插件, xpath() 命令详解

Cypress系列(98)- cypress-xpath 插件, xpath() 命令详解

如果想从头学起Cypress,可以看下面的系列文章哦

https://www.cnblogs.com/poloyy/category/1768839.html

 

前置学习

首先,得对 xpath 语法熟悉哦,可看此链接进行学习

https://www.cnblogs.com/poloyy/p/12626196.html

 

官方地址

https://github.com/cypress-io/cypress-xpath

 

安装方式

npm

npm install -D cypress-xpath

 

Yarn

yarn add cypress-xpath --dev

 

项目导入插件

在 cypress/support/index.js 文件下写下面语句即可

require('cypress-xpath')

 

个人总结

调用 xpath() 命令的两种方式

// 直接 cy.
cy.xpath()

 获取到 element 元素之后再调用
cy.get(ul').xpath()
cy.xpath().xpath()
cy.get(div').first().xpath()

 

xpath() 命令的返回结果

单个 element 元素或多个 element 元素组成的数组

 

入门使用的栗子

it('简单的栗子',function () {
    cy.xpath('//ul/li')
        .should('have.length',6)
});

 

调用 Cypress 命令后再接 xpath 命令

it('调用 Cypress 命令后再接 xpath 命令',1)"> () {
    cy.xpath('//ul')
        .first()
        .xpath('./li')
});

 

调用 xpath 后再接一次 xpath 命令

it('调用 xpath 后再接一次 xpath 命令',1)"> () {
    cy.xpath('//body/ul')
        .xpath('./li')
});

 

根据属性定位元素

it('根据属性定位元素',1)"> () {
    cy.xpath('//*[@id="form-wrapper"]')
    cy.xpath('//*[@class]')
});

 

 选取当前节点的父节点再找元素

it('选取当前节点的父节点',1)"> () {
    cy.xpath('//*[@id="form-wrapper"]/../h2')
});

 

根据索引定位

it('根据索引定位',1)"> () {
    cy.xpath('//body/ul[1]/li[3]')
});

 

条件表达式

it('条件表达式',1)"> () {
    cy.xpath('//*[@name="password" or @id="form-wrapper"]')
}

 

模糊匹配函数

it('模糊匹配函数',1)"> () {
    cy.xpath('//*[starts-with(@class,"e")]')
    cy.xpath('//*[contains(text(),"Show")]')
});

 

定位函数

it('定位函数',1)"> () {
    cy.xpath('//input[position()=1]')
});

 

其他定位方式

it('其他定位方式',1)"> () {
    cy.xpath('//li[position()=2]/preceding-sibling::li')
     等价写法
    cy.xpath('//li[position()=2]/../li[position()<2]')
});

 

lxml xpath() 函数不适用于正确的 XPath 查询

lxml xpath() 函数不适用于正确的 XPath 查询

如何解决lxml xpath() 函数不适用于正确的 XPath 查询

我正在尝试使用 lxml 库评估一些 XPath 查询,但是,由于某种原因,它似乎不起作用。这是代码

if __name__ == ''__main__'':
    xml = r''''''<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<unit xmlns="http://www.srcML.org/srcML/src" revision="0.9.5" language="Java" filename="File.java"><package>package <name><name>com</name><operator>.</operator><name>samples</name><operator>.</operator><name>e978092668</name></name>;</package>
<class><annotation>@<name>Path</name></annotation>
<specifier>public</specifier> class <name>Correct</name> <block>{
    <decl_stmt><decl><annotation>@<name>Inject</name></annotation>
    <specifier>private</specifier> <type><name>JsonWebToken</name></type> <name>field</name></decl>;</decl_stmt>
}</block></class>
</unit>''''''.encode("UTF-8")

    xpath = ''''''unit/class[((descendant-or-self::decl_stmt/decl[(type[name[text()=''JsonWebToken'']] and annotation[name[text()=''Inject'']])]) and (annotation[name[text()=''Path'']]))]''''''
    tree = etree.fromstring(xml)
    a = tree.xpath(xpath)
    print(len(a)) # returns 0 (matches)

我在 freeformatter.com 上使用完全相同的 XML 字符串尝试了完全相同的 xpath 查询,它工作并显示匹配。我不知道我自己的代码有什么问题,因为在大多数情况下,我是按照网站上的官方教程进行的。

编辑 1:

尝试使用命名空间。

    xpath = ''''''src:unit/src:class[((descendant-or-self::src:decl_stmt/src:decl[(src:type[src:name[text()=''JsonWebToken'']] and src:annotation[src:name[text()=''Inject'']])]) and (src:annotation[src:name[text()=''Path'']]))]''''''
    tree = etree.fromstring(xml)
    a = tree.xpath(xpath,namespaces={
        "src": "http://www.srcML.org/srcML/src"
    })
    print(len(a)) # returns 0 (matches)

谢谢!

解决方法

问题是当你这样做时:

tree = etree.fromstring(xml)

tree 具有上下文 src:unit,因此您的 xpath 正在 src:unit 中寻找子 src:unit。 (如果你print(tree.tag),你会看到{http://www.srcML.org/srcML/src}unit。)

尝试在 src:class... 处启动 xpath

xpath = ''''''src:class[((descendant-or-self::src:decl_stmt/src:decl[(src:type[src:name[text()=''JsonWebToken'']] and src:annotation[src:name[text()=''Inject'']])]) and (src:annotation[src:name[text()=''Path'']]))]''''''

Puppeteer xpath 表达式失败,尽管 xpath 表达式有效

Puppeteer xpath 表达式失败,尽管 xpath 表达式有效

如何解决Puppeteer xpath 表达式失败,尽管 xpath 表达式有效

enter image description here

我有一个页面包含屏幕截图中的表格,我正在尝试使用 puppeteer 进行抓取。我可以使用以下方法获取表格:

  1. //table[contains(@class,''table'') and .//th[contains(text(),''Sqft'')]]

(在开发工具中测试)。

现在我想通过 puppeteer 获得它。我试过了:

  1. const page = await browser.newPage();
  2. try {
  3. await page.goto(URL).catch(console.error());
  4. var content = await page.content();
  5. const codeTableXpath = "//table[contains(@class,''Sqft'')]]"
  6. const tablehtml = await content.waitForXPath(codeTableXpath).catch(console.error(''xpath''));

当我逐步执行代码时,错误发生在最后一行。如何抓取表格 html 进行进一步处理?

编辑:

enter image description here

解决方法

page.content() 解析为包含页面完整 HTML 内容的字符串,而 waitForXPath()page 的方法。所以你需要这个(同样,.catch() 需要一个函数引用或一个函数表达式,而不是一个函数调用):

  1. const page = await browser.newPage();
  2. try {
  3. await page.goto(URL).catch(console.error); // function reference
  4. const codeTableXpath =
  5. "//table[contains(@class,''table'') and .//th[contains(text(),''Sqft'')]]";
  6. const table = await page.waitForXPath(codeTableXpath) // just page.waitForXPath()
  7. .catch(() => { console.error(''xpath''); }); // function expression
  8. const tableHTML = await table.evaluate(element => element.outerHTML);
  9. // or: const tableHTML = await (await table.getProperty(''outerHTML'')).jsonValue();

关于您如何使用 xpath 定位非标准 html 标签?xpath定位a标签的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于C# 和 Xpath - 在单个 Xpath 查询中使用节点集和字符串类型返回结果、Cypress系列(98)- cypress-xpath 插件, xpath() 命令详解、lxml xpath() 函数不适用于正确的 XPath 查询、Puppeteer xpath 表达式失败,尽管 xpath 表达式有效的相关知识,请在本站寻找。

本文标签: