CLIでのデフォルトのWebスクレイピング

CLIでのデフォルトのWebスクレイピング

Linuxコマンドラインツールを使用してWebページからhtmlタグとその属性を取得しようとしています。以下は具体的なケースです。

タスクは次のとおりです。ウェブサイト「clojurescript.net」のすべての「script」タグのすべての「src」属性を取得します。これは可能な限り最小限の意識で行う必要があり、特定のテキスト行を取得するためにgrepを使用するのと同じくらい簡単です。

curl -L clojurescript.net | [the toolchain in question "script @src"]
http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js
http://kanaka.github.io/cljs-bootstrap/web/jqconsole.min.js
http://kanaka.github.io/cljs-bootstrap/web/jq_readline.js
[...further results]

私が試したツールはhxnormalize / hxselect、tidy、xmlstarletです。誰も信頼できる結果を得ることはできません。複数のプログラミング言語用のライブラリを使用する場合、これは常に簡単です。

  • それでは、CLIでこれを行うための最新の技術は何ですか?
  • ツリーをより明確に表現するには、まずHTMLをXMLに変換するのが合理的ではありませんか?
  • 通常、HTMLは多くの構文エラーで書かれています。この緩い構造を修正/整理するための基本的な方法(パブリックライブラリで使用されています)はありますか?

属性のみを抽出する追加のオプションと一緒にCSSセレクタを使用できます。しかし、おそらくXPATHはより良い構文選択かもしれません。

答え1

そして

curl "http://clojurescript.net/" | scrape -be '//body/script' | xml2json | jq '.html.body.script[].src

あなたは

"http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"
"http://kanaka.github.io/cljs-bootstrap/web/jqconsole.min.js"
"http://kanaka.github.io/cljs-bootstrap/web/jq_readline.js"
"http://kanaka.github.io/cljs-bootstrap/web/repl-web.js"
"http://kanaka.github.io/cljs-bootstrap/web/repl-main.js"

これらのツールは次のとおりです。

または以下を使用して:

curl "http://clojurescript.net/" | hxnormalize -x | hxselect -i 'body > script' |  grep -oP '(http:.*?)(")' | sed 's/"//g'

あなたは:

http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js
http://kanaka.github.io/cljs-bootstrap/web/jqconsole.min.js
http://kanaka.github.io/cljs-bootstrap/web/jq_readline.js
http://kanaka.github.io/cljs-bootstrap/web/repl-web.js
http://kanaka.github.io/cljs-bootstrap/web/repl-main.js

答え2

私はHTMLを解析することができるスタンドアロンユーティリティを知りません。 XML用のいくつかのユーティリティがありますが、使いやすくはないようです。

多くのプログラミング言語にはHTML解析用のライブラリがあります。ほとんどのUnixシステムにはPerlまたはPythonがあります。 Pythonを使用することをお勧めします美しいスープまたはPerlHTML::ツリービルダー。もちろん、必要に応じて他の言語を使用することもできます(のこぎりルビーなど)

以下は、ダウンロードと解析を組み合わせたPythonの1行です。

python2 -c 'import codecs, sys, urllib, BeautifulSoup; html = BeautifulSoup.BeautifulSoup(urllib.urlopen(sys.argv[1])); sys.stdout.writelines([e["src"] + "\n" for e in html.findAll("script")])' http://clojurescript.net/

またはいくつかのより読みやすいコード行で:

python2 -c '
import codecs, sys, urllib, BeautifulSoup;
html = BeautifulSoup.BeautifulSoup(urllib.urlopen(sys.argv[1]));
scripts = html.findAll("script");
for e in scripts: print(e["src"])
' http://clojurescript.net/

答え3

ノコチェ強力なコマンドライン機能があります。

curl -Ls http://clojurescript.net/ | nokogiri -e 'puts $_.css("script").map{|e|e.attr("src")}'
http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js
http://kanaka.github.io/cljs-bootstrap/web/jqconsole.min.js
http://kanaka.github.io/cljs-bootstrap/web/jq_readline.js
http://kanaka.github.io/cljs-bootstrap/web/repl-web.js
http://kanaka.github.io/cljs-bootstrap/web/repl-main.js

必要な単一のコマンドラインツールのシンプルさと使い慣れたプログラミング言語を使用する単純さを組み合わせることができます。

関連情報