webscraping básico da CLI

3

Estou tentando buscar tags html e seus atributos de uma página da Web com ferramentas de linha de comando do Linux. Aqui está o caso concreto:

Aqui está a tarefa: Obter todos os atributos 'src' de todas as tags 'script' do site 'clojurescript.net' Isso deve acontecer com a menor cerimônia possível, quase tão simples quanto usar o grep para buscar algumas linhas de um texto.

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]

As ferramentas que eu tentei são: hxnormalize / hxselect, tidy, xmlstarlet. Com nenhum eu consegui um resultado confiável. Essa tarefa sempre foi direta ao usar bibliotecas de várias linguagens de programação.

  • Então, qual é o estado da arte de fazer isso no CLI?
  • Faz sentido converter HTML em XML primeiro, para ter um representação de árvore mais limpa?
  • Freqüentemente, o HTML é escrito com muitos erros de sintaxe - existe uma abordagem padrão (que é usada por bibliotecas comuns) para corrigir / limpar essa estrutura solta?

Usar seletores CSS com a opção adicional de extrair apenas um atributo seria ok. Mas talvez o XPATH possa ser uma sintaxe de seleção melhor para isso.

    
por Anton Harald 11.07.2016 / 21:08

3 respostas

2

com

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

você tem

"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"

As ferramentas são:

Ou com:

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

Você tem:

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
    
por 04.01.2017 / 22:22
1

Não conheço nenhum utilitário independente para analisar HTML. Existem utilitários para XML, mas não acho que nenhum deles seja fácil de usar.

Muitas linguagens de programação têm uma biblioteca para analisar HTML. A maioria dos sistemas Unix tem Perl ou Python. Eu recomendo usar o BeautifulSoup do Perthon ou o HTML :: TreeBuilder . Se você preferir, é claro que você pode usar outro idioma ( nokogiri em Ruby, etc.)

Aqui está um one-liner do Python que combina o download com a análise:

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/

Ou como um pouco mais legível:

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/
    
por 12.07.2016 / 01:59
0

O Nokogiri tem uma ótima funcionalidade de linha de comando:

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

Ele permite combinar a simplicidade de uma única ferramenta de linha de comando que você está procurando com a abordagem direta de usar uma linguagem de programação à qual você está acostumado.

    
por 05.05.2017 / 03:09