我正在尝试使用 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"
这些工具是:
- 伟大的jqhttps://stedolan.github.io/jq/;
- 刮https://github.com/jeroenjanssens/data-science-at-the-command-line/blob/master/tools/scrape;
- xml2jsonhttps://github.com/Inist-CNRS/node-xml2json-command。
或者与:
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美丽汤或者 Perl 的HTML::树构建器。如果您愿意,当然可以使用另一种语言(诺科吉里在 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/
答案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
它可以让您将您正在寻找的单个命令行工具的简单性与使用您习惯的编程语言的简单方法结合起来。