【问题标题】:Is there something like a "CSS selector" or XPath grep?有没有类似“CSS 选择器”或 XPath grep 的东西?
【发布时间】:2011-11-12 04:36:52
【问题描述】:

我需要在一堆 HTML 文件中找到所有位置,它们位于以下结构 (CSS) 中:

div.a ul.b

或 XPath:

//div[@class="a"]//div[@class="b"]

grep 在这里对我没有帮助。是否有一个命令行工具可以返回与此标准匹配的所有文件(以及可选的所有位置)?即,如果文件匹配某个 HTML 或 XML 结构,则返回文件名。

【问题讨论】:

  • 你可能会喜欢 sed 并想出一些正则表达式来去除你不关心的元素;但这可能会很复杂并且不可重复使用,除非你在某处将其注销。我只想编写一个 perl 脚本,它使用 XML::Twig::XPath 之类的东西,并为所有带有您正在寻找的类属性的 xmls 打印一条带有文件名的消息。如果您有兴趣,我可以发布一个快速脚本作为答案;但是由于您特别要求命令行解决方案,所以我会推迟。

标签: html xml grep selector findinfiles


【解决方案1】:

pup 是一个用于处理 HTML 的命令行工具。它从标准输入读取,打印到标准输出,并允许用户使用 CSS 选择器过滤页面的某些部分。

受 jq 的启发,pup 旨在成为一种从终端浏览 HTML 的快速灵活的方式。

例子:

$ wget http://en.wikipedia.org/wiki/Robots_exclusion_standard -O robots.html

$ pup --color 'title' < robots.html
<title>
 Robots exclusion standard - Wikipedia, the free encyclopedia
</title>

【讨论】:

  • 酷项目!感谢分享!
【解决方案2】:

试试这个:

  1. 安装http://www.w3.org/Tools/HTML-XML-utils/
    • Ubuntu:aptitude install html-xml-utils
    • MacOS:brew install html-xml-utils
  2. 保存网页(称为 filename.html)。
  3. 运行:hxnormalize -l 240 -x filename.html | hxselect -s '\n' -c "label.black"

其中"label.black" 是唯一标识HTML 元素名称的CSS 选择器。编写一个名为cssgrep的帮助脚本:

#!/bin/bash

# Ignore errors, write the results to standard output.
hxnormalize -l 240 -x $1 2>/dev/null | hxselect -s '\n' -c "$2"

然后你可以运行:

cssgrep filename.html "label.black"

这将为 black 类的所有 HTML label 元素生成内容。

-l 240 参数对于避免解析输出中的换行符很重要。例如,如果&lt;label class="black"&gt;Text to \nextract&lt;/label&gt; 是输入,那么-l 240 会将HTML 重新格式化为&lt;label class="black"&gt;Text to extract&lt;/label&gt;,在第240 列插入换行符,这样可以简化解析。也可以扩展到 1024 或更高。

另见:

【讨论】:

    【解决方案3】:

    我已经用 Node JS 构建了一个命令行工具,它就是这样做的。您输入一个 CSS 选择器,它将搜索目录中的所有 HTML 文件,并告诉您哪些文件与该选择器匹配。

    您需要将 Element Finder cd 安装到您要搜索的目录中,然后运行:

    elfinder -s "div.a ul.b"
    

    更多信息请查看http://keegan.st/2012/06/03/find-in-files-with-css-selectors/

    【讨论】:

      【解决方案4】:

      Per Nat 的回答在这里:

      How to parse XML in Bash?

      Command-line tools that can be called from shell scripts include:
      
      4xpath - command-line wrapper around Python's 4Suite package
      XMLStarlet
      xpath - command-line wrapper around Perl's XPath library
      

      【讨论】:

      • 好的,这是处理 XML 的好方法。似乎这里的概要代码:search.cpan.org/~msergeant/XML-XPath-1.13/XPath.pm 完全符合我的需要。但是,如果我有非 XML HTML(例如,我有一些要搜索的 SSI sn-ps),我还需要一个非 XML 工具。有什么想法吗?
      • 就 SSI 而言,您应该能够使用 xpath,因为它们基本上是由您的服务器解析和处理的 xml cmets。 stackoverflow.com/questions/784745/…
      • 几乎任何 html 变体都应该可以工作,并且您应该能够使用 xpath 访问其中的任何信息,只要其格式正确(这可以通过用于格式化格式错误的库来缓解) html),而不是在 CDATA 元素内部(您将无法使用 xpath 来访问它,因为它不是作为标记处理的)。
      猜你喜欢
      • 2016-06-17
      • 2018-02-09
      • 1970-01-01
      • 2016-01-13
      • 2013-04-26
      • 2020-03-11
      • 2011-09-25
      • 1970-01-01
      • 2011-09-14
      相关资源
      最近更新 更多