CLI에서 기본 웹 스크래핑

CLI에서 기본 웹 스크래핑

Linux 명령줄 도구를 사용하여 웹 페이지에서 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이 있습니다. 파이썬을 사용하는 것이 좋습니다아름다운 수프아니면 Perl의HTML::트리빌더. 물론 원한다면 다른 언어를 사용할 수도 있습니다(노코기리루비 등)

다음은 다운로드와 구문 분석을 결합한 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/

답변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

원하는 단일 명령줄 도구의 단순성과 익숙한 프로그래밍 언어를 사용하는 단순성을 결합할 수 있습니다.

관련 정보