web-dev-qa-db-ja.com

CLIからの基本的なウェブスクレイピング

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がこのためのより良い選択構文かもしれません。

3
Anton Harald

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
aborruso

HTMLを解析するためのスタンドアロンユーティリティを知りません。 XMLにはユーティリティがありますが、どれも使いやすいとは思いません。

多くのプログラミング言語には、HTMLを解析するためのライブラリがあります。ほとんどのUnixシステムにはPerlまたはPythonがあります。 Pythonの BeautifulSoup またはPerlの HTML :: TreeBuilder を使用することをお勧めします。もちろん、別の言語を使用することもできます( nokogiri Rubyなど)

ダウンロードと解析を組み合わせたPythonワンライナー)は次のとおりです。

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/

Nokogiri 優れたコマンドライン機能があります:

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

これにより、探している単一のコマンドラインツールのシンプルさと、慣れ親しんだプログラミング言語を使用する簡単なアプローチを組み合わせることができます。

0
mgamba