как массировать или форматировать html для анализа с помощью xmstarlet?

Должен ли я сначала запускать html в дикой природе через что-то вроде jsoup ? Не сделать его действительным в человеческом смысле, может превратить его в тарабарщину, но по крайней мере так, чтобы xmlstarlet мог обрабатывать файл?

Желательно искать CLI, который можно установить и использовать следующим образом:

massage foo.html > bar.xhtml

или, по крайней мере, что-то в этом роде.

Случай использования:

 thufir@doge:~/.html$ thufir@doge:~/.html$ curl http://int.soccerway.com/ > soccer.html % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 188k 0 188k 0 0 313k 0 --:--:-- --:--:-- --:--:-- 313k thufir@doge:~/.html$ thufir@doge:~/.html$ xmlstarlet sel -t -v "/html/body/table/tr/td[1]" -n soccer.html soccer.html:70.13: xmlParseEntityRef: no name if (this.$ && this.$.fn && this.$.fn.jquery) { ^ soccer.html:70.14: xmlParseEntityRef: no name if (this.$ && this.$.fn && this.$.fn.jquery) { ^ soccer.html:70.26: xmlParseEntityRef: no name if (this.$ && this.$.fn && this.$.fn.jquery) { ^ soccer.html:70.27: xmlParseEntityRef: no name if (this.$ && this.$.fn && this.$.fn.jquery) { ^ soccer.html:198.8: Opening and ending tag mismatch: link line 27 and head </head> ^ soccer.html:209.45: EntityRef: expecting ';' j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= ^ soccer.html:223.40: xmlParseEntityRef: no name if (typeof(e.data) === 'string' && (e.data.indexOf('onEplayerVideoStarted' ^ 

В идеале вы можете запускать htmlstarlet непосредственно против URL-адреса, но, похоже, такого положения нет.

есть опция fo для форматирования , но я не смог получить разные результаты, чем выше.

    One Solution collect form web for “как массировать или форматировать html для анализа с помощью xmstarlet?”

    Если вам просто нужны ячейки данных таблицы, это возможно с помощью xmlstarlet fo за которым следует xmlstarlet sel . Основная проблема, с которой вы сталкиваетесь, связана с xpath. Если вы добавите несколько «подстановочных» элементов ( // ), вы получите желаемый результат:

     # fetch url and send to standard out (-s) curl -s http://int.soccerway.com/ | # interpret input as html (-H) and try to recover as much as possible (-R) xmlstarlet fo -H -R 2> /dev/null | # use the following xpath expression and return the value (-t -v), # also add a newline after the result (-n) xmlstarlet sel -t -v '//table//tr//h3/span' -n 2> /dev/null | # only show the first 10 values head -n10 

    Вывод:

     World - Friendlies Argentina - Prim B Nacional Australia - National Premier Leagues Australia - NPL Youth League Bangladesh - Premier League Belarus - Premier League Benin - Championnat National Brazil - Serie A Brazil - Serie D Brazil - Copa Paulista 
    Linux и Unix - лучшая ОС в мире.