命令行CSS选择器工具


15

哪种工具(最好是Linux)可以根据CSS路径选择HTML元素的内容?

例如,考虑以下HTML文档:

<html>
<body>
  <div class="header">
  <h1>Header</h1>
  </div>
  <div class="content">
    <table>
      <tbody>
      <tr><td class="data">Tabular Content 1</td></tr>
      <tr><td class="data">Tabular Content 2</td></tr>
      </tbody>
    </table>
  </div>
  <div class="footer">
  <p>Footer</p>
  </div>
</body>
</html>

哪些命令行程序(例如,一种“ cssgrep”)可以使用CSS选择器提取值?那是:

cssgrep page.html "body > div.content > table > tbody > tr > td.data"

该程序会将以下内容写入标准输出:

Tabular Content 1
Tabular Content 2

相关链接

谢谢!

Answers:


12

使用W3C工具通过CSS选择器进行HTML / XML解析和内容提取。例如:

hxnormalize -l 240 -x filename.html | hxselect -s '\n' -c "td.data"

将产生所需的输出:

Tabular Content 1
Tabular Content 2

使用240个字符的行长可确保内容较长的元素不会被拆分成多行。该hxnormalize -x命令创建格式正确的XML文档,供hxselect


2
对于macOS用户,brew install html-xml-utils
anishpatel '18

7

CSS解决方案

Element Finder命令将部分完成此任务:

例如:

elfinder -j -s td.data -x "html"

这将结果呈现为JSON格式,可以将其提取。

XML解决方案

XML ::特威格模块(” sudo apt-get install xml-twig-tools“),带有一个名为工具xml_grep,它能够仅仅做到这一点,前提是你的HTML是良好的,当然。

抱歉,我目前无法对此进行测试,但是这样的方法应该可以工作:

xml_grep -t '*/div[@class="content"]/table/tbody/tr/td[@class="data"]' file.html

2

https://github.com/ericchiang/pup具有基于CSS的查询语言,与您的示例非常一致。实际上,使用您的输入,以下命令:

pup "body > div.content > table > tbody > tr > td.data text{}"

产生:

Tabular Content 1
Tabular Content 2

尾部text{}将删除HTML标记。

一个不错的功能是不需要给出完整的路径,因此在您的示例中也可以这样:

$ pup 'td.data text{}' < input.html
Tabular Content 1
Tabular Content 2

其优点之一pup是它使用golang.org/x/net/html包来解析HTML5。


0

Node可以使用JQuery和伪造的DOM做到这一点。

我为此做了一个Docker镜像(https://hub.docker.com/r/phil294/jquery-jsdom/):

docker run --rm -i phil294/jquery-jsdom '$("body > div.content > table > tbody > tr > td.data").text()' < page.html

第二个参数是JavaScript代码,因此您可以做任何您想做的事情。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.