如何使用nodejs模块使用xpath提取html内容

Posted

技术标签:

【中文标题】如何使用nodejs模块使用xpath提取html内容【英文标题】:how to extract html content using xpath using nodejs module 【发布时间】:2015-07-27 02:25:59 【问题描述】:

我正在寻找使用 xpath 的 html 内容提取器,我已经看到了各种类似的 nodejs 模块

jsdom、htmlparser2、xpath、cheerio

我发现cheerio 更适合使用类、id、标签等获取数据,但我无法通过指定 xpath 来获取数据,并且通过使用 xpath nodejs 模块,我能够使用 xpath 获取数据以获取较小的 html、更长的 html它给出了不同类型的错误,例如

找不到实体:@#[line:120,col:9],未关闭的 xml 属性 @#[line:1,col:877]

注意:我无权以任何方式更改 html

例如如果我的 html 是

<html>
<body>

<div>

    <ul id="fruits">
        <li class="apple">Apple</li>
        <li class="orange">Orange</li>
        <li class="pear">Pear</li>
    </ul>

</div>

</body>


</html>

如果我正在使用它并给这个 xpath //*[@id="fruits"]/li[2] 以使用 xpath nodejs 模块查找元素,我没有收到任何错误并且使用 xpath nodejs 模块得到的结果为 Orange,但是如果我我正在使用此页面的 html http://www.infotaxi.org/india_taxi/ahmedabad_taxi.htm

(相当长),并使用 xpath 访问文本部分

//*[@id="navlistmeniu"]/li[3]/a/b, 

我遇到错误

找不到实体:@#[line:120,col:9]

使用 Cheerio,我可以使用类、ID、标签等提取数据,而不是使用 xpath

请帮忙????

【问题讨论】:

您是否有理由需要使用 XPath?使用普通选择器不是cheerio的重点吗? $(#navlistmeniu &gt; li).eq(3).find('a &gt; b'); 嗨,这也是一个好方法,但我只有 xpath 可用,我需要将我的 xpath 转换成这种方式,有什么办法可以制定这个。实际上我有任何孩子的 xpath,比如这个 Orange 的 xpath,我需要获取所有三个的内容,即我的输出应该是 Apple、Orange、Pear,即我的输出应该从给定孩子的父母构造,我希望你能理解,我在说什么 【参考方案1】:

我认为这是你的答案xpath-html,自己测试一下:

const xpath = require("xpath-html");
const node = xpath.fromPageSource(html).findElement("//*[contains(text(), 'with love')]");

【讨论】:

以上是关于如何使用nodejs模块使用xpath提取html内容的主要内容,如果未能解决你的问题,请参考以下文章

Python——XPath使用

爬虫进阶数据提取-lxml模块(万能操作)

Python爬虫基础——XPath语法的学习与lxml模块的使用

python里的爬虫如何使用xpath 提取script里的元素?

有时如何使用 Xpath 从包含链接的表格单元格中提取数据?

如何使用 php 从 HTML 表中提取数据