2016-04-03 1 views
0

Мне удалось извлечь данные с веб-сайта, а затем получить соответствующие данные с извлеченной веб-страницы. Теперь я зациклился на том, как извлекать данные из <td> cols. в массив для обработки данных?Как извлечь данные из <td> cols в массив с помощью bash?

Мой извлеченной HTML выглядит следующим образом:

   <tbody> 

        <tr> 
        <td>abc3207</td> 
<td>151</td> 
<td>Lorem Ipsum</td> 
<td>Off Campus</td> 
<td>OFF</td> 
<td>12 of 999 </td> 
<td>&nbsp;</td> 
<td>&nbsp;</td> 
<td><a href="http://lorem.com/test?id=abc3207&amp;year=2015" target="_blank">Get</a></td> 

        </tr> 

        <tr> 
        <td>abc3207</td> 
<td>151</td> 
<td>Dolor Sit Amet</td> 
<td>Mount Lawley</td> 
<td>ON</td> 
<td>45 of 999 </td> 
<td><a href="http://lorem.com//lookup?sq_content_src=asas">Activity</a></td> 
<td>&nbsp;</td> 
<td><a href="http://lorem.com/test?id=abc3207&amp;year=2015" target="_blank">Get</a></td> 

        </tr> 

       </tbody> 

Я делаю это с помощью Баш скрипт, как я должен делать это только через Баш.

+0

вы рассматривали использование регулярных выражений в сценарии? –

+0

«bash only» означает, что вы ограничили себя неправильными инструментами для работы. –

ответ

0

Чтобы разобрать html или xml, лучше использовать специальные средства командной строки как xmlstarlet или xmllint.

Но с HTML образца, вы можете попробовать это:

mapfile td < <(sed -n 's/[\t ]*<td[^>]*>\(.*\)<\/td>/\1/p' file) 
for td in "${td[@]}"; do 
    printf "$td" 
done 

SED извлекает все содержимое тд и передать результат в файле проекта с помощью process substitution.

mapfile хранит каждую строку подстановкой процесса в переменной массива с именем $td.

Он будет работать с простой HTML с:

  • один td тегов в строке
  • открытия и закрытия td на одной линии
+0

'printf '$ td" 'является ошибкой - если в литеральном тексте есть знак'% ', он будет рассматриваться как строка формата; обратная косая черта будет рассматриваться как escape-последовательность; и т. д. Лучше использовать 'printf '% s \ n'" $ td "' (или, если вы явно * хотите * сопоставлять escape-последовательности, 'printf '% b \ n'" $ td "' - это на самом деле предложенный в качестве предпочтительного шаблона, заменяя 'echo', которые чтят такие последовательности, в [соответствующей спецификации POSIX] (http://pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html), см. «ПРИМЕНЕНИЕ ПРИМЕНЕНИЯ» " раздел). И 'printf '% s \ n'" $ {td [@]} "' будет проще всего распечатать все результаты. –