У меня есть около 100+ файлов, из которых мне нужно извлечь определенную информацию и скопировать их в отдельные файлы. Они все HTML-файлы и имеют HTML-кодирование. Формат файла:

<html>
<head>
...
... useless text ..
</head>
<body>
.. useless text ..
<div class="container">
<div class="another container">
<div class="heading_container">

important text 
<table> ... important table contents </table>
important text
</div> //.../heading 
</div> //garbage div close..
</div>/// etc etc closing divs..
<div class="clear"></div> 
//above line is in all the files... so maybe the script could be written to copy all until this div (?) .
</div>

</body>
</html>

Мне требуется скопировать весь текст в <div class="heading_container"> ...

Любая идея, как я мог бы сделать это в пакетном скрипте? Или какое-нибудь программное обеспечение HTML, чтобы сделать это в пакетном программном обеспечении?

Я не знаю много о пакетных сценариях, но, возможно, сценарий может содержать цикл for / while для копирования текста в файл:

variable string_start = '<div class="heading_container">';
variable string_end = '<div class="clear">';
get file("FILE_URL");
READ the file until `string_start` is reached.
output from 'string start' onwards, to a different folder with same filename.
stop output once string_end is reached.
stop read from the file.

Можно ли это сделать? Я не слишком хорош в синтаксисе алгоритмов!

3 ответа3

1

Если ваш контент будет иметь <div> то ваш скрипт / код должен быть достаточно умным, чтобы определить подходящее закрытие </div> .
Я нашел решение на основе PHP, которое может сделать это. Найдите его здесь: PHP HTML DOM Parser(http://simplehtmldom.sourceforge.net/manual.htm)

Вы можете использовать это в сочетании с directoryiterator и file_put_contents для записи файлов с содержимым в цикле.
Если вы хотите вставить это в HTML-шаблон, вы можете сохранить ваш HTML-шаблон с некоторым различимым текстом вместо фактического контента, который вы хотите поместить следующим образом:

<div class="new_data">
replace_me_discernible_text_not_appearing_anywhere_else_in_file
</div>

Затем вы можете заменить этот текст своим контентом. Вот полный сценарий, чтобы сделать это (частичный кредит сценария идет к OP. Я вставляю здесь для дальнейшего использования):

<?php
include('simple_html_dom.php');

$destdir = "extracted_html";
$oldMessage = "replace_me_discernible_text_not_appearing_anywhere_else_in_file";
$dir = new DirectoryIterator("content_html");
foreach ($dir as $fileinfo)
        {
    if (!$fileinfo->isDot())
                {
                $file_name = basename($fileinfo);
                $html = file_get_html("content_html/$file_name");
                foreach($html->find('div.heading') as $e)
                        {

                        $str=file_get_contents('template.html');
                        $str=str_replace($oldMessage, $e,$str);
                        file_put_contents("$destdir/$file_name", $str);
                        echo $file_name . " <b>Done!</b> </br>";
                        }
                }
        }
?>

Надеюсь, это работает.

1

Это легко сделать с помощью порта Windows PCREGREP и следующей команды:

for %%i in (*.html) do (
  pcregrep -N CRLF -M -o "<div class="""heading_container""">(.+?)</div>" "%%i" ^
  > "%%~ni.cpp"
)

Если у вас есть дополнительные div в середине, то вы можете использовать эту строку в цикле for вместо извлечения до очищающего div:

  …
  pcregrep -N CRLF -M -o "<div class="""heading_container""">(.+?)<div class="""clear""">" "%%i" ^
  …

Рисунок 1: Результаты теста

Скриншот результатов теста

0

Хорошо, это простая версия того, что вы

#!/bin/sh 
for X in $(find ./ -name "*.html")
    do
    FN=$(echo $X | cut -d '/' -f 3)
    cat $X | awk '/^< div class=\"heading_container\" >/,/< div class=\"clear\"><\/div >/  { print }' > ./new/$FN   
    done 

Если все ваши файлы находятся в подпапке dir, которая называется old, в директории под названием files. Запустите это из файлов dir, он извлечет нужную информацию и поместит ее в то же имя файла в каталоге ./files/new.

Это довольно странно, и не будет работать, если есть старые директории.

Я мог бы взглянуть на улучшение этого и буду обновлять, если я могу сделать лучше.

ОБНОВИТЬ

Несмотря на то, что мне сказали, что цель - это Windows, это более полный скрипт bash, который может помочь кому-то в будущем.

#!/bin/sh

cd old

# Create the directory structure in the 'new' directory 

for Z in $(find ./ -type d)
        do
        Z=$(echo $Z | tr -d '.')
        mkdir ../new/$Z
        done
cd ..
# Find all relevent files snip the interesting bit and copy to the same file in ../new 

for X in $(find ./ -name "*.html")
        do
        FN=$(echo $X | cut -d '/' -f 3-100)
        cat $X | awk '/^< div class=\"heading_container\" >/,/< div class=\"clear\"><\/div >/  { print }' > ./new/$FN
        done

Главное предостережение заключается в удалении (резервном копировании и удалении) «нового» каталога перед запуском.

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