У меня около 20 веб-страниц. Каждая страница имеет верхнюю навигацию по баннеру, а затем информацию о 20 транспортных средствах. Есть 2 таблицы на транспортное средство.
Логическая последовательность действий: навигация по страницам, таблица 1 для транспортного средства 1, таблица 2 для транспортного средства 1, таблица 1 для транспортного средства 2, таблица 2 для транспортного средства 2, ... конец страницы.
Пример таблиц включен ниже.

Я хочу получить информацию из HTML-страниц и в базу данных.
План: разделить данные для каждого отдельного транспортного средства на отдельные файлы, а затем проанализировать / извлечь данные из файлов.

Я не понимаю, awk, поэтому я использую sed.

План извлечения: найдите строку с "car_photo", вернитесь на 4 строки (которые будут тегом таблицы), извлеките эту строку до второго тега / таблицы. Повторите до окончательного набора таблиц.

Я искал в Интернете примеры того, как заставить sed извлекаться из заданного номера строки до следующего экземпляра регулярного выражения ... он продолжает извлекаться до последнего экземпляра. И даже если это сработало, я хочу извлечь его до 2-го экземпляра.

Вот пример файла с заменой данных с более общей информацией.


32321 Марка: Модель:
Год:
VIN:
Цвет:
Год приобретения:
Пробег: Последняя замена масла: Страховой срок: Срок действия регистрации:
32322 Марка: Модель:
Год:
VIN:
Цвет:
Год приобретения:
Пробег: Последняя замена масла: Страховой срок: Срок действия регистрации:
32321 Марка: Модель:
Год:
VIN:
Цвет:
Год приобретения:
Пробег: Последняя замена масла: Страховой срок: Срок действия регистрации:
32323 Марка: Модель:
Год:
VIN:
Цвет:
Год приобретения:
Пробег: Последняя замена масла: Страховой срок: Срок действия регистрации:
32324 Марка: Модель:
Год:
VIN:
Цвет:
Год приобретения:
Пробег: Последняя замена масла: Страховой срок: Срок действия регистрации:
32325 Марка: Модель:
Год:
VIN:
Цвет:
Год приобретения:
Пробег: Последняя замена масла: Страховой срок: Срок действия регистрации:


Я попытался создать цикл, который будет работать 20 раз. Каждый раз sed извлекает строки 1 через строку с помощью </table> затем снова запускает sed для удаления этих строк. Затем он извлекает строки 1 через следующую строку с помощью </table> снова (чтобы получить 2-ю таблицу), затем sed удаляет вторую таблицу.

Each time `sed` extracts a table, it concatenates to a new file using the loop counter.

Проблема в том, что sed не останавливается при первом появлении </table> . Это останавливается в последнем появлении.

1 ответ1

0

Если бы я делал это часто, я бы использовал парсинг XPath через что-то вроде драгоценного камня Nokogiri для Ruby.

Тем не менее, вот что может сработать, но без bash-скрипта для их объединения потребуется пара шагов на файл (я думаю, что в вашем случае это 20).

Шаг 1: Преобразуйте HTML в построчно, насколько это возможно, чтобы awk мог его обработать.

Начиная с html-ввода вашего комментария в car.html , я сделал

cat car.html | awk -F"> " '{ for( i = 1; i <= NF; i++ ) printf( "%s>\n", $i ) } ' > new.html

который дал мне новый файл new.html как

<table>
<tr><td width="90">
<div class="car_photo">
<div class="space">
<img src="../photos/veh5.jpeg">
</div>
</div>
</div>
</td>
<td align="right" class="car_details" width="400">
<table>
<tr>
<td class="line_bottom" width="190">
<div class="text_left">32325</a>
</div>
</td>
</tr>
</table>
<div class="line_bottom">
Make: </div>
<div class="line_bottom">Model: <br>Year: <br />
</div>
</td>
<td class="car_details" width="400">
<div class="line_bottom">Mileage:</div>
<div class="line_bottom">Oil Change: </div>
<div class="line_bottom">Registration:</div>
<br>
</td>
</tr>
</table>

Шаг 2: Возьмите этот файл и поместите его через скрипт awk, который я поместил в его собственный файл с именем awko

#!/usr/bin/awk -f

BEGIN { FS=">" }

$1 ~ /<table/ { table_cnt++ }

$1 ~ /<\/table/ { table_cnt-- }

table_cnt > 0 {
    for( i = 1; i <= NF; i++ ) {
        split( $i, arr, "<" )
        if( length( arr[ i ] ) > 0 )
            printf( "%s\n", arr[ 1 ] )
    }

}

работает как

awko new.html 

дал мне результат, как:

32325
Make: 
Model: 
Mileage:
Oil Change: 
Registration:

Вывод в awko можно изменить, чтобы сделать вывод в стиле CSV, чтобы упростить его импорт в БД. И снова, эти разные шаги можно было бы объединить в сценарии оболочки для "тяжелого подъема имени файла" в правильном цикле, но у меня сейчас нет времени на это.

По сути, awko ищет текст каждой строки с указанным началом / концом.

К сожалению. Я только заметил, что этот вопрос старый. Ну да ладно, в любом случае, даю ответ.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .