Извлечь Текст Из HTML

Печать (Ctrl+P)

Работа со строками в БСП 3.0

Общий модуль СтроковыеФункцииКлиентСервер

При работе c HTML файлами из интернета часто приходится извлекать текст в формте HTML , очищенный от тегов, скриптов и заголовков для сохраненеия при необходимости в переменной типа строка с неограниченной длиной. .

ТекстСодержания = СтроковыеФункцииКлиентСервер.ИзвлечьТекстИзHTML( ИсходныйТекстHTML);

Функцция очищает текст в формате HTML от тегов и возвращает неформатированный текст.
Параметры:
ИсходныйТекстHTML – Строка – текст в формате HTML.
Возвращаемое значение: Строка – текст, очищенный от тегов, скриптов и заголовков.

Функция ИзвлечьТекстИзHTML(Знач ИсходныйТекст) Экспорт
     Результат = "";
 Текст = НРег(ИсходныйТекст); // отрезаем все что не body 
Позиция = СтрНайти(Текст, "<body"); 
Если Позиция > 0 Тогда  
   Текст = Сред(Текст, Позиция + 5); 
    ИсходныйТекст = Сред(ИсходныйТекст, Позиция + 5); 
    Позиция = СтрНайти(Текст, ">"); 
    Если Позиция > 0 Тогда 
        Текст = Сред(Текст, Позиция + 1);
         ИсходныйТекст = Сред(ИсходныйТекст, Позиция + 1);
     КонецЕсли;
 КонецЕсли; 
Позиция = СтрНайти(Текст, "</body>"); 
Если Позиция > 0 Тогда  
   Текст = Лев(Текст, Позиция - 1);
     ИсходныйТекст = Лев(ИсходныйТекст, Позиция - 1);
 КонецЕсли; // вырезаем скрипты 
Позиция = СтрНайти(Текст, "<script");
 Пока Позиция > 0 Цикл  
   ПозицияЗакрывающегоТега = СтрНайти(Текст, "</script>");
     Если ПозицияЗакрывающегоТега = 0 Тогда         // Не найден закрывающий тег - вырезаем оставшийся текст.
 ПозицияЗакрывающегоТега = СтрДлина(Текст);
     КонецЕсли; 
    Текст = Лев(Текст, Позиция - 1) + Сред(Текст, ПозицияЗакрывающегоТега + 9); 
    ИсходныйТекст = Лев(ИсходныйТекст, Позиция - 1) + Сред(ИсходныйТекст, ПозицияЗакрывающегоТега + 9); 
    Позиция = СтрНайти(Текст, "<script");
 КонецЦикла; // вырезаем стили
Позиция = СтрНайти(Текст, "<style"); 
Пока Позиция > 0 Цикл  
   ПозицияЗакрывающегоТега = СтрНайти(Текст, "</style>");
     Если ПозицияЗакрывающегоТега = 0 Тогда   // Не найден закрывающий тег - вырезаем оставшийся текст.
   ПозицияЗакрывающегоТега = СтрДлина(Текст); 
    КонецЕсли; 
    Текст = Лев(Текст, Позиция - 1) + Сред(Текст, ПозицияЗакрывающегоТега + 8); 
    ИсходныйТекст = Лев(ИсходныйТекст, Позиция - 1) + Сред(ИсходныйТекст, ПозицияЗакрывающегоТега + 8);
     Позиция = СтрНайти(Текст, "<style"); 
КонецЦикла; // вырезаем все теги    
 Позиция = СтрНайти(Текст, "<"); 
Пока Позиция > 0 Цикл    
 Результат = Результат + Лев(ИсходныйТекст, Позиция-1);
     Текст = Сред(Текст, Позиция + 1);
     ИсходныйТекст = Сред(ИсходныйТекст, Позиция + 1);
     Позиция = СтрНайти(Текст, ">");
     Если Позиция > 0 Тогда 
        Текст = Сред(Текст, Позиция + 1); 
        ИсходныйТекст = Сред(ИсходныйТекст, Позиция + 1); 
    КонецЕсли;  
   Позиция = СтрНайти(Текст, "<"); 
КонецЦикла; 
Результат = Результат + ИсходныйТекст; 
МассивСтрок = РазложитьСтрокуВМассивПодстрок(Результат, Символы.ПС, Истина, Истина); 
Возврат СокрЛП(СтрСоединить(МассивСтрок, Символы.ПС));
 КонецФункции

В теле данной функции есть вызов другой функции РазложитьСтрокуВМассивПодстрок

Функция РазложитьСтрокуВМассивПодстрок разбивает строку на несколько строк по указанному разделителю. Разделитель может иметь любую длину. В случаях, когда разделителем является строка из одного символа, и не используется параметр СокращатьНепечатаемыеСимволы,
рекомендуется использовать функцию платформы СтрРазделить.

Параметры данной функции:
Значение – Строка – текст с разделителями;
Разделитель – Строка – разделитель строк текста, минимум 1 символ;
ПропускатьПустыеСтроки – Булево – признак необходимости включения в результат пустых строк.
Если параметр не задан, то функция работает в режиме совместимости со своей предыдущей версией:
– для разделителя-пробела пустые строки не включаются в результат, для остальных разделителей пустые строки включаются в результат;
– если параметр Строка не содержит значащих символов или не содержит ни одного символа (пустая строка), то в случае разделителя-пробела результатом функции будет массив, содержащий одно значение “” (пустая строка), а при других разделителях результатом функции будет пустой массив.
СокращатьНепечатаемыеСимволы – Булево – сокращать непечатаемые символы по краям каждой из найденных подстрок.
Возвращаемое значение:
Массив – массив строк.
Пример:

 Результат =  СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(",один,,два,", ",");
  // возвратит массив из 5 элементов, три из которых  - пустые: "", "один", "", "два", ""; 
 СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(",один,,два,", ",", Истина)
 //  - возвратит массив из двух элементов: "один", "два";
 //  СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(" один   два  ", " ")
 //  - возвратит массив из двух элементов: "один", "два";
 //  СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок("")
 //  - возвратит пустой массив;
 // 
 СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок("",,Ложь)
 //  - возвратит массив с одним элементом: ""(пустая строка);
 //  СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок("", " ")
 //  - возвратит массив с одним элементом: "" (пустая строка).
 //   
Функция РазложитьСтрокуВМассивПодстрок(Знач Значение, Знач Разделитель = ",", Знач ПропускатьПустыеСтроки = Неопределено, 
     СокращатьНепечатаемыеСимволы = Ложь) Экспорт
 Если Разделитель = ","   И ПропускатьПустыеСтроки = Неопределено  И СокращатьНепечатаемыеСимволы Тогда 
     Результат = СтрРазделить(Значение, ",", Ложь);
     Для Индекс = 0 По Результат.ВГраница() Цикл 
        Результат[Индекс] = СокрЛП(Результат[Индекс]) 
    КонецЦикла;
     Возврат Результат; 
КонецЕсли; 
Результат = Новый Массив;
 // Для обеспечения обратной совместимости. 
Если ПропускатьПустыеСтроки = Неопределено Тогда
     ПропускатьПустыеСтроки = ?(Разделитель = " ", Истина, Ложь);
     Если ПустаяСтрока(Значение) Тогда 
         Если Разделитель = " " Тогда 
            Результат.Добавить(""); 
        КонецЕсли; 
        Возврат Результат; 
    КонецЕсли;
 КонецЕсли;
 //
 Позиция = СтрНайти(Значение, Разделитель);
 Пока Позиция > 0 Цикл 
    Подстрока = Лев(Значение, Позиция - 1);
     Если Не ПропускатьПустыеСтроки Или Не ПустаяСтрока(Подстрока) Тогда
         Если СокращатьНепечатаемыеСимволы Тогда
             Результат.Добавить(СокрЛП(Подстрока)); 
        Иначе  
           Результат.Добавить(Подстрока); 
        КонецЕсли; 
    КонецЕсли;  
   Значение = Сред(Значение, Позиция + СтрДлина(Разделитель));
     Позиция = СтрНайти(Значение, Разделитель); КонецЦикла; 
Если Не ПропускатьПустыеСтроки Или Не ПустаяСтрока(Значение) Тогда
     Если СокращатьНепечатаемыеСимволы Тогда 
        Результат.Добавить(СокрЛП(Значение));
     Иначе 
        Результат.Добавить(Значение); 
    КонецЕсли;
 КонецЕсли; 
Возврат Результат;
 КонецФункции 

См. также

Previous Article
Next Article

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.