Модераторы: powerfox, ZeeLax
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [bash] Извлечение значений тегов в html файле 
V
    Опции темы
Ak47black
  Дата 11.9.2010, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

Репутация: нет
Всего: 0



Здравствуйте.
Я новичок в nix.
Хочу написать скрипт на bash, который
Цитата

Скачивает некий html файл, через wget
После чего из него извлекает все <h1>, <h2>, ... , <h6> значения между тегами и выводит их на экран, добавляя к каждому значению n-ое количество символов табуляции в зависимости от типа тега по возрастанию.


Более конкретней, то например он скачивает этот файл
http://www.w3schools.com/TAGS/tryit_view.a...tryhtml_headers
И выводит в консоль
Цитата

This is heading 1
    This is heading 2
        This is heading 3
            This is heading 4
                This is heading 5
                    This is heading 6


Начал писать
Код

#!/bin/bash
wget http://www.w3schools.com/TAGS/tryit_view.asp?filename=tryhtml_headers -O doc.html

Но вот незнаю как тут дальше лучше быть с открытием файла и поиском подстрок.
Подскажите пожалуйста, есть-ли что-то стандартное для поиска значений между двумя тегами?
Или как тут подойти к решению?

Это сообщение отредактировал(а) Ak47black - 11.9.2010, 12:45
PM MAIL   Вверх
bilbobagginz
Дата 11.9.2010, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: 113
Всего: 317



все это называется парсинг.
лучше всего делать это скриптовым языком программирования (ruby, python, perl и т.д.)
в языках есть библиотечки обработки XML/HTML.

если кровь из носу делать на баш, то надо чтобы в системе были установлены приложения sed, awk, которые позволяют находить регулярные выражения и разбивать их на разные части.
но проблема в том, что у <h есть несколько вероятных концовок, которые надо будет предусмотреть в скрипте.
иногда у <h тэга есть свойства. 
поэтому лучше всего все-таки взять "нормальный" скриптовый язык, и работать с ним.





--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
Ak47black
  Дата 11.9.2010, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

Репутация: нет
Всего: 0



Подскажите пожалуйста, вот почти рабочий код
Код

#!/bin/bash
FILENAME="doc.html"
wget http://www.w3schools.com/TAGS/tryit_view.asp?filename=tryhtml_headers -O $FILENAME
clear
if [ ! -e $FILENAME ]
then
    echo "Download Error."
    exit 1
fi
echo "OK"

for ((i=1; i <= 6 ; i++))
do
    #echo "h$i"
    #grep "h$i" $FILENAME
    VALUE=`sed -n -e "s/.*<h$i>\(.*\)<\/h$i>.*/\1/p" $FILENAME`
    #echo $VALUE
    if [ "$VALUE" != "" ]
    then
        for ((e=1; e < $i ; e++))
        do
            VALUE=$'\t'$VALUE
            #echo $VALUE
        done
        echo $VALUE
    fi    
done

Застрял, казалось-бы на самом незначительном моменте с табуляцией.
Если сделать
Код

    VALUE=$' test'$
    echo $VALUE

то почему-то пробел и символы табуляции отбрасываются
тоесть будет (без пробела впереди)
Цитата

test

Как быть?
И есть-ли по короче способ добавить n-ое количество символов табуляции в моём случае?

Это сообщение отредактировал(а) Ak47black - 11.9.2010, 18:52
PM MAIL   Вверх
bilbobagginz
Дата 12.9.2010, 00:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: 113
Всего: 317



надо добавить команде echo ключ -e:
Код

#!/bin/bash
## gettoc.bash
URLS=$*
for u in ${URLS}
do
    FILENAME="`mktemp`.html"
    wget -q -O ${FILENAME} ${u}
    if [ $? -ne 0 ]
    then
          echo "Error getting: ${u}; EXITTING!"
          exit 1
    fi
    for ((i=1; i <= 6 ; i++))
    do
        VALUE=`sed -n -e "s/.*<h$i>\(.*\)<\/h$i>.*/\1/p" $FILENAME`
        if [ "$VALUE" != "" ]
        then
            for ((e=1; e < $i ; e++))
            do
                VALUE="\t$VALUE"
           done
           echo -e $VALUE
        fi    
    done
    rm -f ${FILENAME}
done

запуск:
Код

./gettoc.sh http://www.w3schools.com/TAGS/tryit_view.asp?filename=tryhtml_headers


(или список URLов)

Добавлено через 52 секунды
я не проверял на "пограничные случаи", но если они есть - намного легчи их обработать в нормальном языке.



--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
Ak47black
Дата 12.9.2010, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

Репутация: нет
Всего: 0



Цитата(bilbobagginz @  12.9.2010,  00:55 Найти цитируемый пост)
надо добавить команде echo ключ -e

Благодарю  smile  +

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Linux/UNIX: Oбщие вопросы"
nickless
Imple
nerezus

В тему здесь вопросы общие - не привязанные к определенному ПО или дистрибутиву BSD/Linux/UNIX.
Например вопросы о выборе ОС для определенных задач (но если Вы просто хотите узнать "Какой дистрибутив лучше", то для этого есть Клуб юнуксоидов).
Общие вопросы по shell-программированию тоже лучше задавать здесь.


  • Вопросы мобильной разработки тут
  • Вы должны соблюдать правила форума.
  • Помните: какой вопрос, такой и ответ. Прежде чем задать вопрос прочитайте вот эту статью на форуме CIT.
  • Оскорблять запрещается.
  • Религиозные войны в Религиозных войнах.
  • Общение "просто так" в Клубе юнуксоидов. В отличие от многих других разделов, здесь разрешается сдержанно оффтопить и юморить в тему.

За интересные статьи, находки, решения, программы и просто реальную помощь будут ставиться + в репу).


В данный момент этот раздел модерируют nerezus, nickless, powerfox, pythonwin, Imple и ZeeLax. Если вы хотите помочь нам, пишите в ПМ и мы обсудим.


Спасибо. И use UNIX or die; С уважением, nerezus, nickless, powerfox, pythonwin, Imple, ZeeLax.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | *NIX системы: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0700 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.