web-dev-qa-db-ja.com

コマンドラインCSSセレクターツール

質問

CSSパスに基づいてHTML要素のコンテンツを選択できるツール(できればLinuxの場合)はどれですか?

たとえば、次の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>

CSSセレクターを使用して値を抽出できるコマンドラインプログラム(「cssgrep」の一種など)は何ですか?あれは:

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

プログラムは、標準出力に以下を書き込みます。

Tabular Content 1
Tabular Content 2

関連リンク

ありがとうございました!

15
Dave Jarvis

CSSセレクターを使用したコンテンツのHTML/XML解析および抽出には、 W3Cツール を使用します。例えば:

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

目的の出力を生成します。

Tabular Content 1
Tabular Content 2

240文字の行の長さを使用すると、コンテンツが長い要素が複数の行に分割されないことが保証されます。 hxnormalize -xコマンドは、hxselectで使用できる整形式のXMLドキュメントを作成します。

12
Dave Jarvis

CSSソリューション

Element Finderコマンドは、このタスクを部分的に実行します。

例えば:

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

これにより、結果がJSON形式でレンダリングされ、抽出できます。

XMLソリューション

XML :: Twig モジュール( "Sudo apt-get install xml-twig-tools")には、xml_grepという名前のツールが付属しており、HTMLの形式が整っていれば、それを実行できます。コース。

申し訳ありませんが、現時点ではこれをテストできませんが、次のようなもので動作するはずです。

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

https://github.com/ericchiang/pup には、例に厳密に準拠したCSSベースのクエリ言語があります。実際、入力すると、次のコマンドが実行されます。

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

生成:

Tabular Content 1
Tabular Content 2

末尾のtext{}HTMLタグを削除します。

優れた機能の1つは、フルパスを指定する必要がないことです。そのため、ここでも例を示します。

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

pupの利点の1つは、HTML5の解析にgolang.org/x/net/htmlパッケージを使用することです。

2
peak

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

2番目の引数はJavaScriptコードなので、本当にやりたいことが何でもできます。

0
phil294