最近很多小伙伴都在问您如何使用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标签)
- C# 和 Xpath - 在单个 Xpath 查询中使用节点集和字符串类型返回结果
- Cypress系列(98)- cypress-xpath 插件, xpath() 命令详解
- lxml xpath() 函数不适用于正确的 XPath 查询
- Puppeteer xpath 表达式失败,尽管 xpath 表达式有效
您如何使用 xpath 定位非标准 html 标签?(xpath定位a标签)
如何解决您如何使用 xpath 定位非标准 html 标签?
$html = ''<g-review-stars><spanaria-label="Rated 4.7 out of 5," role="img"><span></span></span></g-review-stars>'';
$doc = new DOMDocument;
$doc->loadHTML($html);
$xpath = new DOMXpath($doc);
$node= $xpath->query(''//g-review-stars[]''
)->item(0);
$html = $node->ownerDocument->saveHTML($node); //
print_r($html);
据我所知,没有办法做到这一点,所以我想知道是否有某种黑客攻击。问题是谷歌没有在包装 g-review-stars 的 div 标签中使用任何特定的 id,所以很难定位它。
Warning: DOMDocument::loadHTML(): Tag g-review-stars invalid in Entity,line: 1
in C:\\Sources\\modules\\test-pregmatch\\script.PHP on line 6
Warning: DOMXPath::query(): Invalid expression in C:\\Sources\\modules\\test-pregma
tch\\script.PHP on line 8
Fatal error: Uncaught Error: Call to a member function item() on boolean in C:\\S
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>''
作为输出。
解决方法
应该这样做:
$node= $xpath->query(''.//g-review-stars'');
echo $doc->saveHTML($node[0]);
输出:
<g-review-stars>
<span class="Fam1ne EBe1af" aria-label="Rated 4.7 out of 5," role="img">
<span style="width:63px">
</span>
</span>
</g-review-stars>
C# 和 Xpath - 在单个 Xpath 查询中使用节点集和字符串类型返回结果
如何解决C# 和 Xpath - 在单个 Xpath 查询中使用节点集和字符串类型返回结果
在项目中,我使用 Xpath 来抓取价格。在这种情况下,我可以有 2 个选项来获取下一个查询指定的价格:
var xpath = @"substring-after(//div[@price''],":")|//span[@pln">oldPrice"]";
在 C# 代码中:
HtmlDocument htmlDocument = new HtmlDocument();
htmlDocument.LoadHtml(html);
XPathNavigator navigator = document.DocumentNode.CreateNavigator();
var eval = navigator.Evaluate(xpath); // here i get error: Expression must evaluate to a node-set.
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,可以看下面的系列文章哦
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 查询,但是,由于某种原因,它似乎不起作用。这是代码
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 进行抓取。我可以使用以下方法获取表格:
//table[contains(@class,''table'') and .//th[contains(text(),''Sqft'')]]
(在开发工具中测试)。
现在我想通过 puppeteer 获得它。我试过了:
const page = await browser.newPage();
try {
await page.goto(URL).catch(console.error());
var content = await page.content();
const codeTableXpath = "//table[contains(@class,''Sqft'')]]"
const tablehtml = await content.waitForXPath(codeTableXpath).catch(console.error(''xpath''));
当我逐步执行代码时,错误发生在最后一行。如何抓取表格 html 进行进一步处理?
编辑:
解决方法
page.content()
解析为包含页面完整 HTML 内容的字符串,而 waitForXPath()
是 page
的方法。所以你需要这个(同样,.catch()
需要一个函数引用或一个函数表达式,而不是一个函数调用):
const page = await browser.newPage();
try {
await page.goto(URL).catch(console.error); // function reference
const codeTableXpath =
"//table[contains(@class,''table'') and .//th[contains(text(),''Sqft'')]]";
const table = await page.waitForXPath(codeTableXpath) // just page.waitForXPath()
.catch(() => { console.error(''xpath''); }); // function expression
const tableHTML = await table.evaluate(element => element.outerHTML);
// 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 表达式有效的相关知识,请在本站寻找。
本文标签: