Что нового

[Данные, строки] Проверка на наличие файлов, на которые есть ссылка в html

Tapok

Новичок
Сообщения
204
Репутация
0
Дано:
Папка "ill" с подпапкой "picture" с иллюстрациями вида:
Код:
"Илл.9.1.24.Практические^параметры.png"
Папка "html" с несколькими десятками html в которых есть гиперссылки вида:
Код:
"<span ID="ACH-LINK" class="pic_ill/picture/Илл.9.1.47.Задание^на^тест.png_name_Илл.^9.1.47.^Задание^на^тест" title="">(см. илл. 9.1.47)</span>"
Требуется:
Проверить, что в папке "picture" есть все иллюстрации, на которые есть ссылки в html. Выдать массив иллюстраций, которых нет в папке "picture", а ссылка в html файлах на них есть, записать этот массив в новый txt файл.
 
Автор
T

Tapok

Новичок
Сообщения
204
Репутация
0
C2H5OH сказал(а):
А вопрос у тебя какой?

Требуется:

Проверить, что в папке "picture" есть все иллюстрации, на которые есть ссылки в html. Выдать массив иллюстраций, которых нет в папке "picture", а ссылка в html файлах на них есть, записать этот массив в новый txt файл.

Как это сделать? такой и вопрос... :-\
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
Tapok [?]
Как это сделать?
Можно так:
Код:
#include <Array.au3>
Global $aMatches[0], $aNotExistingFiles[0], $hFile
Global $sCode = '"<span ID="ACH-LINK" class="pic_ill/picture/Илл.9.1.47.Задание^на^тест.png_name_Илл.^9.1.47.^Задание^на^тест" title="">(см. илл. 9.1.47)</span>"'

$aMatches = StringRegExp($sCode, '<span.*?class="(.*?)_name_.*?"', 3)
If @error Then Exit 1
_ArrayDisplay($aMatches, "matches")
For $i = 0 To UBound($aMatches) - 1
	If Not FileExists($aMatches[$i]) Then _ArrayAdd($aNotExistingFiles, $aMatches[$i])
Next
If Not IsArray($aNotExistingFiles) Or UBound($aNotExistingFiles) = 0 Then Exit 2
_ArrayDisplay($aNotExistingFiles, "not existing files")
$hFile = FileOpen("not_existing_files.txt", 2)
FileWrite($hFile, _ArrayToString($aNotExistingFiles, @CRLF))
FileClose($hFile)
 
Автор
T

Tapok

Новичок
Сообщения
204
Репутация
0
Я наверное не совсем точно описал то, что хочу :-\
В папке "picture" может совсем не быть иллюстраций, может быть несколько, не все те, на которые есть ссылки в html файлах папки "html".
Это и должен выявить код, показав все отсутствующие файлы...
И в файле "not_existing_files.txt" должны быть только те имена файлов png, которых нет в папке "picture" (но ссылка на них есть в html)
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
Tapok сказал(а):
Я наверное не совсем точно описал то, что хочу :-\
В папке "picture" может совсем не быть иллюстраций, может быть несколько, не все те, на которые есть ссылки в html файлах папки "html".
Это и должен выявить код, показав все отсутствующие файлы...
И в файле "not_existing_files.txt" должны быть только те имена файлов png, которых нет в папке "picture" (но ссылка на них есть в html)
По-моему мой код так и работает...
 
Автор
T

Tapok

Новичок
Сообщения
204
Репутация
0
Я может ошибаюсь, но код
Код:
Global $sCode = '"<span ID="ACH-LINK" class="pic_ill/picture/Илл.9.1.47.Задание^на^тест.png_name_Илл.^9.1.47.^Задание^на^тест" title="">(см. илл. 9.1.47)</span>"'

$aMatches = StringRegExp($sCode, '<span.*?class="(.*?)_name_.*?"', 3)
осуществляет поиск в $sCode, а не в html-ках, и в файле
Код:
"not_existing_files.txt"
всегда
Код:
"pic_ill/picture/Илл.9.1.47.Задание^на^тест.png"

Чувствую, надо еще дописать код (цикл) для просмотра всех html... :-\
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
Tapok [?]
осуществляет поиск в $sCode, а не в html-ках
Чувствую, надо еще дописать код (цикл) для просмотра всех html...
Ну так бы сразу и сказали...
Код:
#include <Array.au3>
#include <File.au3>
Global $aHtmlFiles
$aHtmlFiles = _FileListToArrayRec(@ScriptDir, "*.html;*.htm", 1, 1)
If @error = 9 Then Exit MsgBox(16, "error", "Not found")
If @error Then Exit MsgBox(16, "error", "error_code=" & @error & ", extended_code=" & @extended)
;_ArrayDisplay($aHtmlFiles,"html_files")
For $f = 1 To $aHtmlFiles[0]
	_main(FileRead($aHtmlFiles[$f]))
Next

Func _main($sCode, $sFile = "not_existing_files.txt")
	Local $aMatches[0], $aNotExistingFiles[0], $hFile
	$aMatches = StringRegExp($sCode, '<span.*?class="(.*?)_name_.*?"', 3)
	If @error Then Return SetError(1)
	;_ArrayDisplay($aMatches, "matches")
	For $i = 0 To UBound($aMatches) - 1
		If Not FileExists($aMatches[$i]) Then _ArrayAdd($aNotExistingFiles, $aMatches[$i])
	Next
	If Not IsArray($aNotExistingFiles) Or UBound($aNotExistingFiles) = 0 Then Return SetError(2)
	;_ArrayDisplay($aNotExistingFiles, "not existing files")
	$hFile = FileOpen($sFile, 2)
	FileWrite($hFile, _ArrayToString($aNotExistingFiles, @CRLF))
	If @error Then Return SetError(3)
	FileClose($hFile)
	Return 1
EndFunc   ;==>_main
 
Автор
T

Tapok

Новичок
Сообщения
204
Репутация
0
Насколько я понимаю, сейчас скрипт вытаскивает из всех html ссылки на файлы "*.png" типа:
Код:
Rpic_ill/picture/Илл.49.бегемот.png
А нужно, чтобы сравнивались эти ссылки с именами файлов в папке
Код:
ill/picture
и если такой файл (иллюстрация) есть - ссылка в итоговый файл "not_existing_files.txt"
не попадает, а если нет (нашли "битую" ссылку - то она пишется в файл "not_existing_files.txt")
:scratch:
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
Так что ли?
Код:
#include <Array.au3>
#include <File.au3>
Global $aHtmlFiles
$aHtmlFiles = _FileListToArrayRec(@ScriptDir, "*.html;*.htm", 1, 1)
If @error = 9 Then Exit MsgBox(16, "error", "Not found")
If @error Then Exit MsgBox(16, "error", "error_code=" & @error & ", extended_code=" & @extended)
_ArrayDisplay($aHtmlFiles, "html_files")
For $f = 1 To $aHtmlFiles[0]
	_main(FileRead($aHtmlFiles[$f]))
Next

Func _main($sCode, $sFile = "not_existing_files.txt")
	Local $aMatches[0], $aNotExistingFiles[0], $hFile, $sCheckFilePath
	$aMatches = StringRegExp($sCode, '<span.*?class="pic_ill\/picture\/(.*?)_name_.*?"', 3)
	If @error Then Return SetError(1)
	_ArrayDisplay($aMatches, "matches")
	For $i = 0 To UBound($aMatches) - 1
		$sCheckFilePath = "ill\picture\" & $aMatches[$i]
		If Not FileExists($sCheckFilePath) Then _ArrayAdd($aNotExistingFiles, $sCheckFilePath)
	Next
	If Not IsArray($aNotExistingFiles) Or UBound($aNotExistingFiles) = 0 Then Return SetError(2)
	_ArrayDisplay($aNotExistingFiles, "not existing files")
	$hFile = FileOpen($sFile, 2)
	FileWrite($hFile, _ArrayToString($aNotExistingFiles, @CRLF))
	If @error Then Return SetError(3)
	FileClose($hFile)
	Return 1
EndFunc   ;==>_main
 
Автор
T

Tapok

Новичок
Сообщения
204
Репутация
0
Прикреплен архив с тестом.
При компилировании "test.au3" выдается
Код:
"html\91121.html", "Илл.9.1.8.Солнечное^утро.png"
.
Должно быть:
1. Из файла html вытаскиваются названия иллюстраций ("Илл.9.1.8.Солнечное^утро.png", "Илл.49.бегемот_1.gif" и т.д.)
2. Эти имена сравниваются с теми файлами, которые есть в папке "ill\picture", "ill\gif".
3. Может быть 3 варианта:
1) Все совпало - выдается сообщение "Все ОК";
2) В файлах html нашли ссылки на иллюстрации, которых реально в папках нет - в файл "no pictures.txt" помещаются названия отсутствующих иллюстраций;
3) В папках иллюстраций "ill\picture", "ill\gif" нашли "лишние" иллюстрации (на которые нет ссылок) - в файл "no links.txt" помещаются названия лишних иллюстраций;

Пока такого нет :-\

Файл
Код:
"Илл.9.1.8.Солнечное^утро.png"
есть, ссылка на него есть, а все равно он показывается.
 

Вложения

  • test.zip
    120.6 КБ · Просмотры: 2

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Tapok [?]
Проверить, что в папке "picture" есть все иллюстрации, на которые есть ссылки в html. Выдать массив иллюстраций, которых нет в папке "picture", а ссылка в html файлах на них есть, записать этот массив в новый txt файл.
Мой вариант.
Код:
#include<Array.au3>

$oDoc = ObjCreate("HTMLFILE")

$hFirstFile = FileFindFirstFile(StringFormat('%s\html\*.html', @ScriptDir))
If $hFirstFile = -1 Then
	MsgBox(16, @ScriptName, "No files/directories")
	Exit
EndIf

While 1

	$iCount = 0
	$sFileName = FileFindNextFile($hFirstFile)
	If @error Then ExitLoop

	$oDoc.open
	$sHtml = FileRead(StringFormat('%s\html\%s', @ScriptDir, $sFileName))
	$oDoc.write($sHtml)
	$oDoc.close

	$oSpan = $oDoc.getElementsByTagName("span")

	Local $aPic[1000]
	; проверка битых ссылок
	For $i = 0 To $oSpan.length-1
		If $iCount = UBound($aPic) Then
			ReDim $aPic[UBound($aPic)+1000]
		EndIf
		$aListSpan = StringSplit($oSpan.item($i).className, '/_', 2)
		If Not FileExists(StringFormat('%s\ill\picture\%s', @ScriptDir, $aListSpan[3])) Then
			$aPic[$iCount] = $aListSpan[3]
			$iCount +=1
		EndIf
	Next

	$aListSpan = 0
	If $iCount Then
		; если есть битые ссылки записываем в файл отчёта. иначе файл не создаётся.
		ReDim $aPic[$iCount]
		; _ArrayDisplay($aPic, StringFormat('%d image does not exist in the %s', $iCount, $sFileName))
		$hFile = FileOpen(StringFormat('%s\html\%s.not_existing.log', @ScriptDir, $sFileName), 2)
		For $i = 0 To UBound($aPic) -1
			FileWriteLine($hFile, $aPic[$i])
		Next
		FileClose($hFile)
	Else
		; если все ссылки поправили, то при повторном анализе файл отчёта удаляется (если таковой существует)
		If FileExists(StringFormat('%s\html\%s.not_existing.log', @ScriptDir, $sFileName)) Then
			FileDelete(StringFormat('%s\html\%s.not_existing.log', @ScriptDir, $sFileName))
		EndIf
	EndIf

	$aPic = 0
	Sleep(10)
WEnd
 
Автор
T

Tapok

Новичок
Сообщения
204
Репутация
0
Garrett!
Код работает, но, почему-то, возникает ошибка (в прикрепленном файле), если добавляю некоторые html...некоторые глотает, на некоторые ошибку выдает, сейчас пытаюсь понять особенности html, на которые ругается...какой-то код в некоторых html не нравится :-\
 

Вложения

  • 2015-05-04_19-17-46.png
    2015-05-04_19-17-46.png
    9.7 КБ · Просмотры: 8

Garrett

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

Tapok

Новичок
Сообщения
204
Репутация
0
Да, так и есть, в папке "html" может быть много файлов *.html.
Нашел, на что ругается - на файл html, в котором нет ссылок на иллюстрации...как это исправить?
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Tapok [?]
ругается - на файл html, в котором нет ссылок на иллюстрации
Файлы html могут быть пустыми, это не важно.
У меня всё нормально.
 
Автор
T

Tapok

Новичок
Сообщения
204
Репутация
0
Код:
"D:\test\Garrett.au3" (31) : ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
If Not FileExists(StringFormat('%s\ill\picture\%s', @ScriptDir, $aListSpan[3])) Then
If Not FileExists(StringFormat('%s\ill\picture\%s', @ScriptDir, ^ ERROR
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Перед строкой:
Код:
If Not FileExists(StringFormat('%s\ill\picture\%s', @ScriptDir, $aListSpan[3])) Then

добавьте строчку:
Код:
ConsoleWrite(StringFormat('file: %s\n', $sFileName))

Когда появится ошибка, посмотрите в консоли имя файла и прикрепите его к посту.
 
Автор
T

Tapok

Новичок
Сообщения
204
Репутация
0
Файл 91000.html
 

Вложения

  • 91000.zip
    541 байт · Просмотры: 3

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Ошибка возникала из-за этих строк.
Код:
<span ID="ACH-LINK" class="html_91100" title="">9.1.1 Текст 1</span>
Поправил.
Код:
#include<Array.au3>

$oDoc = ObjCreate("HTMLFILE")

$hFirstFile = FileFindFirstFile(StringFormat('%s\html\*.html', @ScriptDir))
If $hFirstFile = -1 Then
	MsgBox(16, @ScriptName, "No files/directories")
	Exit
EndIf

While 1

	$iCount = 0
	$sFileName = FileFindNextFile($hFirstFile)
	If @error Then ExitLoop

	$oDoc.open
	$sHtml = FileRead(StringFormat('%s\html\%s', @ScriptDir, $sFileName))
	$oDoc.write($sHtml)
	$oDoc.close

	$oSpan = $oDoc.getElementsByTagName("span")

	Local $aPic[1000]
	; проверка битых ссылок
	For $i = 0 To $oSpan.length-1
		If $iCount = UBound($aPic) Then
			ReDim $aPic[UBound($aPic)+1000]
		EndIf

		$aListSpan = StringSplit($oSpan.item($i).className, '/_', 2)
		If UBound($aListSpan) <= 2 Then ContinueLoop
		If Not FileExists(StringFormat('%s\ill\picture\%s', @ScriptDir, $aListSpan[3])) Then
			$aPic[$iCount] = $aListSpan[3]
			$iCount +=1
		EndIf
	Next

	$aListSpan = 0
	If $iCount Then
		; если есть битые ссылки записываем в файл отчёта. иначе файл не создаётся.
		ReDim $aPic[$iCount]
		$hFile = FileOpen(StringFormat('%s\html\%s.not_existing.log', @ScriptDir, $sFileName), 2)
		For $i = 0 To UBound($aPic) -1
			FileWriteLine($hFile, $aPic[$i])
		Next
		FileClose($hFile)
	Else
		; если все ссылки поправили, то при повторном анализе файл отчёта удаляется (если таковой существует)
		If FileExists(StringFormat('%s\html\%s.not_existing.log', @ScriptDir, $sFileName)) Then
			FileDelete(StringFormat('%s\html\%s.not_existing.log', @ScriptDir, $sFileName))
		EndIf
	EndIf

	$aPic = 0
	Sleep(10)
WEnd
 
Верх