Что нового

[Данные, строки] Парсер html страниц с заменой текста между известными тегами

Статус
Закрыто для дальнейших ответов.

Tapok

Новичок
Сообщения
204
Репутация
0
Вопрос такой, есть текст html, в нем ссылки на иллюстрации, ссылки пронумерованы, могут добавляться новые ссылки, поэтому жесткая нумерация не получается. Как заменить текст между тегами, которые я сам установил? Пример:

1. Мама мыла раму (см. илл. 1).
2. Папа чинит автомобиль (см. илл. 2).
3. На столе лежали: ручки (см. илл. 3), карандаши (см. илл. 4), фломастеры (см. илл. 5).

Надо заменить текст "(см. илл. 1)" (и остальные) на гиперссылки. В пункте 2 может появиться новая иллюстрация, с номером 3, которая собъет всю дальнейшую нумерацию.

Логично в тексте прописать так:

1. Мама мыла раму <Rt#>(см. илл. 1)<Rt##>.
2. Папа чинит автомобиль <Rt#>(см. илл. 2)<Rt##>.
3. На столе лежали: ручки <Rt#>(см. илл. 3)<Rt##>, карандаши <Rt#>(см. илл. 4)<Rt##>, фломастеры <Rt#>(см. илл. 5)<Rt##>.

Дальше искать все вхождения <Rt#><Rt##>, и заменять их и текст между ними на нужную гиперссылку.

Как это сделать?

Важно, чтобы в нужном месте была конкретная иллюстрация, ее номер по порядку не важен.

Одинаковых гиперссылок (на одну иллюстрацию) по тексту может быть несколько, все надо заменить.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Код:
$vTest = '...<Rt5>(см. илл. 5)<Rt55>...'

$sRet = StringRegExpReplace($vTest, '(<Rt(\d+)>)(\(см\. илл\. \2\))(<Rt\2\2>)', '$1<a href=link#$2>$3</a>$4')
ConsoleWrite($sRet & @LF)


Как то так.
 
Автор
T

Tapok

Новичок
Сообщения
204
Репутация
0
Это не совсем то. Нет автоматической нумерации иллюстраций, цифра иллюстрации какая есть, такая и будет, просто вместо текста вы получаете гиперссылку. Смысл то всего, что выделенные известными тегами участки кода заменяются на гиперссылки с автоматической расстановкой нумерации.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Нужно иметь список замен, что на что менять.
И дальше заменять согласно этому списку.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Tapok
Можешь проще показать, что было, и как должно выглядеть?
Приведи два разных примера исходного текста, и их замену.
 
Автор
T

Tapok

Новичок
Сообщения
204
Репутация
0
15_исх.txt - исходный текстовый файл (html), в котором в местах, где планируется показать иллюстрацию, поставлены заготовки гиперссылок.
15.html - результирующий файл html, в котором все (см. илл. ***) текстового файла заменены на гиперссылку, в нужном виде (под конкретную программу их читающую в нужном виде).
Номера иллюстраций в каждом месте не важны, они просто идут по порядку по мере появления. Одна и та же иллюстрация может быть в нескольких местах.
Как произвести такую замену и сделать авторасстановку нумерации?
 

Вложения

  • 15.zip
    654 байт · Просмотры: 7
  • 15_исх.txt
    171 байт · Просмотры: 8

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Как то так:

Код:
$vTest = FileRead(@DesktopDir & '\15_исх.txt')

$sRet = StringRegExpReplace($vTest, _
	'\(см. илл. (\d+)\)', _
	'<span ID="ACH-LINK" class="pic_ill/picture/Илл._\1.Название иллюстрации.png_name_Илл.^\1.^Название^иллюстрации" title="">см. илл. \1</span>')

ConsoleWrite($sRet & @LF)
 
Автор
T

Tapok

Новичок
Сообщения
204
Репутация
0
Спасибо за последний пост, кажется он мне поможет!
Единственное, почему он не воспринимает (удаляет) теги <p></p>, если их добавить в файл 15_исх.txt?

Из:

<p>1.3.4 Заголовок</p>
<p>Подзаголовок 1 </p>
<p>Текст 1</p>
<p>Подзаголовок 2 </p>
<p>Начало текста (см. илл. 12) окончание текста. </p>
<p>Подзаголовок 3 </p>
<p>Следующий текст (см. илл. 14).</p>

Получается:

1.3.4 Заголовок
Подзаголовок 1
Текст 1
Подзаголовок 2
Начало текста <span ID="ACH-LINK" class="pic_ill/picture/Илл._12.Название иллюстрации.png_name_Илл.^12.^Название^иллюстрации" title="">см. илл. 12</span> окончание текста.
Подзаголовок 3
Следующий текст <span ID="ACH-LINK" class="pic_ill/picture/Илл._14.Название иллюстрации.png_name_Илл.^14.^Название^иллюстрации" title="">см. илл. 14</span>.

Без тегов <p></p>... Почему?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Tapok [?]
почему он не воспринимает (удаляет) теги <p></p>, если их добавить в файл 15_исх.txt?
У меня ничего не удаляется. Возможно не в тот файл добавлено? :smile:
 
Автор
T

Tapok

Новичок
Сообщения
204
Репутация
0
Удаляет :(
Было:
<p>1.3.4 Заголовок</p>
<p>Подзаголовок 1 </p>
<p>Текст 1</p>
<p>Подзаголовок 2 </p>
<p>Начало текста (см. илл. 12) окончание текста. </p>
<p>Подзаголовок 3 </p>
<p>Следующий текст (см. илл. 14).</p>

Стало:

1.3.4 Заголовок

Подзаголовок 1
Текст 1
Подзаголовок 2
Начало текста <span ID="ACH-LINK" class="pic_ill/picture/Илл._12.Название иллюстрации.png_name_Илл.^12.^Название^иллюстрации" title="">см. илл. 12</span> окончание текста.
Подзаголовок 3
Следующий текст <span ID="ACH-LINK" class="pic_ill/picture/Илл._14.Название иллюстрации.png_name_Илл.^14.^Название^иллюстрации" title="">см. илл. 14</span>.

Может запись в файл не так написал?

$vTest = FileRead(@DesktopDir & '\15_исх.txt')
$sRet = StringRegExpReplace($vTest, _
'\(см. илл. (\d+)\)', _
'<span ID="ACH-LINK" class="pic_ill/picture/Илл._\1.Название иллюстрации.png_name_Илл.^\1.^Название^иллюстрации" title="">см. илл. \1</span>')
ConsoleWrite($sRet & @LF)
FileWrite("d:\3D\Autoit\Test\15_res.txt" , $sRet & @LF)


Добавлено:
Сообщение автоматически объединено:

Теги отображаются, все правильно, но! Имена у иллюстраций одинаковые, так не правильно. Имена должны быть разные . В папке picture лежат иллюстрации:

pic_ill/picture/Илл.1.Название_1
pic_ill/picture/Илл.2.Название_2
pic_ill/picture/Илл.3.Название_3

Эти названия должны записываться соответственно в свою позицию:
вместо (см. илл. 1) будет ссылка на эту илл. с тем названием, которое в илл.1
Аналогично для всех иллюстраций, у них всех разные имена...
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Tapok [?]
Может запись в файл не так написал?
:laugh: Я бы сказал не туда.

Имена у иллюстраций одинаковые
Имена (то что в ссылке) записываются с подстановкой числа из текста "(см. илл. 1)", т.ч одинаковыми они не могут быть. Если в них нужно ещё чтобы и текст разнился, то нужно создавать таблицу (массив) соответствий.
 
Автор
T

Tapok

Новичок
Сообщения
204
Репутация
0
Re: [Данные, строки] Парсер html страниц

А можно примерно набросать, как с этим массивом будет выглядеть? На примере двух ссылок как по тексту... :-\
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Tapok [?]
можно примерно набросать, как с этим массивом будет выглядеть?
Код:
Dim $aTable[][] = _
	[ _
		['\(см. илл. ([1-9])\)', 'pic_ill/picture/Илл._$2.Название иллюстрации.png_name_Илл.^$2.^Название^иллюстрации'], _ ;от 1 до 9
		['\(см. илл. (1[0-9])\)', 'pic_ill/picture/Илл._$2.Другое Название иллюстрации.png_name_Илл.^$2.^Другое^Название^иллюстрации'] _ ;от 10 до 19
	]

$sString = _
	'<p>1.3.4 Заголовок</p>' & @CRLF & _
	'<p>Подзаголовок 1 </p>' & @CRLF & _
	'<p>Текст 1</p>' & @CRLF & _
	'<p>Подзаголовок 2 </p>' & @CRLF & _
	'<p>Начало текста  (см. илл. 7) окончание текста. </p>' & @CRLF & _
	'<p>Начало текста  (см. илл. 12) окончание текста. </p>' & @CRLF & _
	'<p>Подзаголовок 3 </p>' & @CRLF & _
	'<p>Следующий текст  (см. илл. 14).</p>' & @CRLF

For $i = 0 To UBound($aTable) - 1
	$sString = StringRegExpReplace($sString, '(' & $aTable[$i][0] & ')', '<span ID="ACH-LINK" class="' & $aTable[$i][1] & '" title="">$1</span>')
Next

ConsoleWrite($sString & @LF)
 
Автор
T

Tapok

Новичок
Сообщения
204
Репутация
0
Re: [Данные, строки] Парсер html страниц

Спасибо большое! Практически то, что хотел! Буду разбираться :smile:

Прямо проникся Регулярными Выражениями! :-[

Теперь помимо Autoit :IL_AutoIt_1: буду и их изучать :smile:

Спасибо!





Добавлено:
Сообщение автоматически объединено:

Единственное, что в коде получилось, что иллюстрации каждой группы имеют одно и то же название, а надо, чтобы

(см. илл. 1) становилось

<span ID="ACH-LINK" class="pic_ill/picture/Илл.1.Ягоды.png_name_Илл.^1.^Ягоды" title="">(см. илл. 1)</span>

(см. илл. 5) становилось

<span ID="ACH-LINK" class="pic_ill/picture/Илл.5.Фрукты.png_name_Илл.^5.^Фрукты" title="">(см. илл. 5)</span>

(см. илл. 11) становилось

<span ID="ACH-LINK" class="pic_ill/picture/Илл.11.Овощи.png_name_Илл.^11.^Овощи" title="">(см. илл. 11)</span>

и, если где-то по тексту, появится еще (см. илл. 5), то оно тоже заменится на

<span ID="ACH-LINK" class="pic_ill/picture/Илл.5.Фрукты.png_name_Илл.^5.^Фрукты" title="">(см. илл. 5)</span>

:-\ :scratch: :'(
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Tapok [?]
иллюстрации каждой группы имеют одно и то же название, а надо, чтобы
Ну так в чём проблема, в таблице соответствий нужно жёстко задать цифру.

Можно ещё так сделать:

Код:
Dim $aTable[][] = _
    [ _
        [1, 'Ягоды'], _
        [5, 'Фрукты'] _
    ]

$sSpan = '<span ID="ACH-LINK" class="pic_ill/picture/Илл.%i.%s.png_name_Илл.^%i.^%s" title="">%s</span>'
$sFind = '(см. илл. %i)'

$sString = _
    '<p>1.3.4 Заголовок</p>' & @CRLF & _
    '<p>Подзаголовок 1 </p>' & @CRLF & _
    '<p>Текст 1</p>' & @CRLF & _
    '<p>Подзаголовок 2 </p>' & @CRLF & _
    '<p>Начало текста  (см. илл. 1) окончание текста. </p>' & @CRLF & _
    '<p>Начало текста  (см. илл. 5) окончание текста. </p>' & @CRLF & _
    '<p>Подзаголовок 3 </p>' & @CRLF & _
    '<p>Следующий текст  (см. илл. 5).</p>' & @CRLF

For $i = 0 To UBound($aTable) - 1
	$sFindFrmtd = StringFormat($sFind, $aTable[$i][0])
	
    $sString = StringReplace($sString, _
		$sFindFrmtd, _
		StringFormat($sSpan, $aTable[$i][0], $aTable[$i][1], $aTable[$i][0], $aTable[$i][1], $sFindFrmtd))
Next

ConsoleWrite($sString & @LF)


Далее просто редактировать таблицу, добавляя соответствия цифр с названием в ссылке.
 
Автор
T

Tapok

Новичок
Сообщения
204
Репутация
0
Re: [Данные, строки] Парсер html страниц

Да, красота! Для полноты картины...если я поставил ссылки на иллюстрации с 1 по 10, а потом мне надо вставить новую иллюстрацию в место, рядом с пятой, я ее прописываю как илл.11, получается нумерация вразнобой, не по порядку. Можно ли это как то исправить? Или потом можно пройтись по всем илл. и сменить нумерацию на правильную, по порядку... как это сделать?! Иллюстрации к нумерации не привязаны, главное, чтобы по тексту не было илл. 65 раньше чем илл.3.

Соответственно, в имени иллюстрации не будет прописано конкретное число, будет просто название "Фрукты.png" :-\

Важно, чтобы нужная иллюстрация была в нужном месте и с правильным именем, ее номер не важен, при этом по тексту нумерация должна быть по порядку. Одна и та же иллюстрация может быть в разных местах под одним и тем же номером.

Еще важный момент, номер иллюстрации может быть не числом, а вида "4.1.15" т.е. (см. илл. 4.1.15)
Как для этого случая написать код?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Tapok [?]
потом мне надо вставить новую иллюстрацию в место, рядом с пятой, я ее прописываю как илл.11, получается нумерация вразнобой, не по порядку
А что мешает её вставить по порядку?
 
Автор
T

Tapok

Новичок
Сообщения
204
Репутация
0
Допустим уже есть ссылки на илл. от 1 до 10, если я хочу вставить новую илл. посередине, то ее номер должен быть скажем 5, а он уже занят :smile: свободный номер 11 не подойдет, так так тогда будет не по порядку. Если новую илл. сделать пятой, то надо будет менять нумерацию всех последующих илл. ...

Вставить по порядку можно было бы, если бы у нее не было номера, просто ссылка на иллюстрацию. Но на экране должна показываться иллюстрация, а под ней ее название с номером (для нас не важно каким, нужен чтобы удобно было ее найти)
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Tapok

Предупреждение За нарушение правил форума (пункт В.11):
Любые отрывки AutoIt кода необходимо заключать в тег [autoit]
autoit.gif
(подробнее), а обычный код соответственно в тег [code]
code.gif
(подробнее). Также большие выдержки текста помещайте под тег [spoiler]
spoiler.gif
(подробнее), там где это поддерживается естественно. Как в случае с названием темы, также короткое и эргономичное сообщение привлекает больше внимания, и шансы на получение конкретного ответа увеличиваются.


С уважением, ваш Модератор.
 
Статус
Закрыто для дальнейших ответов.
Верх