2015-09-09 2 views
3

Я пытаюсь извлечь 3 столбца из таблицы в HTML. Мне нужно имя хоста, товар + регион и дата добавлены. Таким образом, они будут колонны 1, 3, 4.Разбирайте столбцы HTML-таблицы с bash

<div class="table sectionedit2"> 
    <table class="inline"> 
    <tr class="row0"> 
     <th class="col0 centeralign">hostname</th> 
     <th class="col1 centeralign">AKA (Client hostname)</th> 
     <th class="col2 leftalign">Product + Region</th> 
     <th class="col3 centeralign">date added</th> 
     <th class="col4 centeralign"> decom. date </th> 
     <th class="col5 centeralign">   builder   </th> 
     <th class="col6 centeralign"> build cross-checker </th> 
     <th class="col7 leftalign"> <strong>decommissioner</strong></th> 
     <th class="col8 centeralign">customer managed filesystems</th> 
     <th class="col9 centeralign"> only company has root? </th> 
    </tr> 
    <tr class="row1"> 
     <th class="col0 centeralign">HostName01</th> 
     <td class="col1 leftalign">Host01</td> 
     <td class="col2 leftalign">EU</td> 
     <td class="col3 centeralign">2007-01-01</td> 
     <td class="col4 leftalign"></td> 
     <td class="col5 centeralign">Me</td> 
     <td class="col6 centeralign">You</td> 
     <td class="col7 leftalign">Builder01</td> 
     <td class="col8 leftalign">xChecker01</td> 
     <td class="col9 centeralign">yes</td> 
    </tr> 
    <tr class="row2"> 
    <th class="col0 centeralign">HostName02</th> 
    <td class="col1 leftalign">Host02</td> 
    <td class="col2 leftalign">U.S</td> 
    <td class="col3 centeralign">2008-09-29</td> 
    <td class="col4 leftalign"></td> 
    <td class="col5 leftalign">Me01</td> 
    <td class="col6 leftalign">You01</td> 
    <td class="col7 leftalign">Builder02</td> 
    <td class="col8 leftalign">xChecker02</td> 
    <td class="col9 centeralign">yes</td> 

Я хочу получить:

Hostname  Product + Region Date added 

HostName01 EU     2007-01-01 

HostName02 U.S    2008-09-29 

Ранее я пытался зачистки HTML-теги и используя AWK, хотя некоторые из столбцов в таблице пустой. Это означает, что я не получал колонки 1, 3 и 4 для всех строк.

Я пытаюсь использовать:

xmllint --html --shell --format table.log <<< "cat //table/tr/th/td[1]/text()" 

Это дает мне вторую колонку, я попробовал «[0]», который не работает, и я не уверен, как получить несколько колонок сразу ,

ответ

1

Предполагая, что ваш HTML хорошо сформированный XML, может это сделать:

xmlstarlet sel -t -m '//table/tr' -v '*[contains(@class,"col0")]' -o $'\t' \ 
            -v '*[contains(@class,"col2")]' -o $'\t' \ 
            -v '*[contains(@class,"col3")]' -n  \ 
    file.html 
hostname Product + Region date added 
HostName01 EU 2007-01-01 
HostName02 U.S 2008-09-29 
3

Вы можете сделать следующее:

  • перспективе xmllint --xpath с выражением XPath, который использует position()= для захвата только столбцов 1, 3 и 4: //table/tr/*[position()=1 or position()=3 or position()=4]
  • трубы через perl -pe "s/<th class=\"col0/\n<th class=\"col0/g" и т.д., чтобы вырезать разметку и разбить его на отдельные линии
  • трубы через grep -v '^\s*$' вырезать пустые строки
  • трубы через column -t в конце концов довольно-печать это

как это:

xmllint --html \ 
    --xpath "//table/tr/*[position()=1 or position()=3 or position()=4]" \ 
    table.log \ 
    | perl -pe "s/<th class=\"col0/\n<th class=\"col0/g" \ 
    | perl -pe 's/<tr[^>]+>//' \ 
    | perl -pe 's/<\/tr>//' \ 
    | perl -pe 's/<t[dh][^>]*>//' \ 
    | perl -pe 's/<\/t[dh]><t[dh][^>]*>/|/g' \ 
    | perl -pe 's/<\/t[dh]>//' \ 
    | grep -v '^\s*$' \ 
    | column -t -s '|' 

выше предполагает, что HTML документ находится в файле table.log (который, кажется странным именем для HTML-файла, но это, кажется, имя, ы использовали в вопросе ...). Если документ действительно находится в каком-то другом файле *.html, конечно, просто поместите фактическое имя файла.

Это даст вам выход, как это:

hostname Product + Region date added 
HostName01 EU    2007-01-01 
HostName02 U.S    2008-09-29 
Смежные вопросы