Что нового

[Сеть, интернет] Сохранение HTML кода страницы в файл

Neldezheil

B like Bee
Сообщения
27
Репутация
3
Возникла проблема с сохранением HTML кода страницы в файл.
Код:
#include <IE.au3>
#include <File.au3>

Func SaveHTML($Link)
	Dim $aHTML
	$oIE = _IECreate($Link)
	_IELoadWait($oIE)
	$aHTML = _IEBodyReadHTML($oIE)
	_FileWriteFromArray("\html.txt", $aHTML)
EndFunc

SaveHTML("www.ya.ru")


вопрос в том, что именно возвращает _IEBodyReadHTML:
если делаю вывод в консоль, то возвращается исходный текст страницы корректно. далее, делал вывод результата выполнения _FileWriteFromArray - возвращает 0, т.е. неведомую мне ошибку...

вопрос - где мой косяк и как его поправить...

попробовал сделать несколько иначе:
Код:
#include <IE.au3>
#include <File.au3>

Func SaveHTML($Link)
	Dim $aHTML
	$oIE = _IECreate($Link)
	_IELoadWait($oIE)
	$aHTML = _IEBodyReadHTML($oIE)
	FileOpen ("html.txt", 2)
	FileWrite("html.txt", $aHTML)
EndFunc

SaveHTML("www.ya.ru")


в данном случае в созданный файл html.txt записывается нужная инфа, но теряется построчное разбиение кода, а мне оно критично :(
 

SyDr

Сидра
Сообщения
651
Репутация
158
_IEBodyReadHTML возвращает не массив, а строку.
_FileWriteFromArray записывает массив, а не строку.
Возвращаемое значение 0 означает в данном случае, что нужно проверить значение флага @error
Ну и последнее, весь исходник этой страницы находится в одной строчке :smile:
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Neldezheil
попробуй так
Код:
#include <IE.au3>

SaveHTML("www.ya.ru")

Func SaveHTML($Link)
    Dim $aHTML
    $oIE = _IECreate($Link)
    _IELoadWait($oIE)
    $aHTML = _IEBodyReadHTML($oIE)
    $File=FileOpen (@ScriptDir&"\html.htm", 2)
    FileWrite($File, $aHTML)
    FileClose($File)
EndFunc


У меня в 32 строки возвращается. А если использовать Tidy из Notepad++, то становится полностью ворматированный текст в 99 строк.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
AZJIO
Вы в конце функции, по-моему, забыли закрыть файл.
Код:
FileClose($File)
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
madmasles
Да, забыл, хотел вообще убрать FileOpen, так как мелкие файлы как бы и так запишет.

Код:
#include <IE.au3>

Func SaveHTML($Link)
    Dim $aHTML
    $oIE = _IECreate($Link)
    _IELoadWait($oIE)
    $aHTML = _IEBodyReadHTML($oIE)
    FileWrite("html.txt", $aHTML)
EndFunc

SaveHTML("www.ya.ru")
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Neldezheil
А можно еще так, например.
Код:
#include <INet.au3>

SaveHTML("http://www.google.ru/", @ScriptDir&"\html.html")

Func SaveHTML($Link, $sFile)
    Dim $aHTML
    $aHTML = _INetGetSource($Link)
    $File=FileOpen ($sFile, 2)
    FileWrite($File, $aHTML)
	FileClose($File)
EndFunc
 
Автор
N

Neldezheil

B like Bee
Сообщения
27
Репутация
3
Окончательно разобрался с данным вопросом, правда пришлось прибегнуть к топорному методу, но данный способ работы меня устраивает. Вот итоговая функция

Код:
Func SaveHTML($Link, $sFile)
    Dim $aHTML
    $aHTML = _INetGetSource($Link)
	If Not(FileExists($sFile)) Then
		Run("notepad.exe")
		WinWaitActive("Безымянный - Блокнот")
		Send($aHTML)
		WinClose("Безымянный - Блокнот")
		Send("!Д")
		WinWaitActive("Сохранить как")
		Sleep(750)
		ControlSend("Сохранить как", '', '[CLASS:Edit; INSTANCE:1]', $sFile)
		Sleep(750)
		ControlClick("Сохранить как","",'[CLASS:Button; INSTANCE:2]')
	Else
		FileDelete($sFile)
		SaveHTML($Link, $sFile)
	EndIf
EndFunc


Как работает - берем ссылку и вытягиваем из нее html-код в переменную $aHTML. Затем запускаем блокнот и вбиваем туда этот код, сохраняем в его в $sFile.

Данный способ является медленным, но именно он формирует текстовый документ в нужном мне порядке, т.к. _INetGetSource формирует файл одной строкой, хоть и вставляет в нужные места Chr(13)

P.S.: код робит с русской версией винды, ибо используется простой блокнот
 

Fever

Скриптер
Сообщения
308
Репутация
112
а почему бы не сделать так?

Код:
#include <File.au3>

HtmlRead('http://mysite.com')

Func HtmlRead($source, $file = 'result.txt')

$html = BinaryToString(InetRead($source))
If Not FileExists($file) Then _FileCreate($file)
FileWrite($file, $html)
MsgBox(64, 'Завершено!', 'Html код страницы успешно записан в файл.')
EndFunc
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Neldezheil [?]
вставляет в нужные места Chr(13)
Не, никаких дополнительных символов нет, по которым можно бы сделать переходы строк. Так что регулярным выражением не получится сделать правильное форматирование.

А вопрос, зачем это нужно? В Notepad++ есть Tidy, который форматирует по заказу, как тот же Tidy для au3. Никакие переходы строк не сделают такого форматирования. А для других случаев читабельное форматирование вроде как и никчему.

 
Автор
N

Neldezheil

B like Bee
Сообщения
27
Репутация
3
Fever сказал(а):
а почему бы не сделать так?

Код:
#include <File.au3>

HtmlRead('http://mysite.com')

Func HtmlRead($source, $file = 'result.txt')

$html = BinaryToString(InetRead($source))
If Not FileExists($file) Then _FileCreate($file)
FileWrite($file, $html)
MsgBox(64, 'Завершено!', 'Html код страницы успешно записан в файл.')
EndFunc

Это также работает, но вот в чем моя проблема.
http://narod.ru/disk/20465676000/4.JPG.html

так выглядит сформированный документ при открытии в блокноте.
Для того, чтобы Chr(13) все-таки переводил коретку мне приходится перебивать его в блокнот и сохранять. Тогда получается файл в том виде, в котором он мне нужен


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

AZJIO сказал(а):
А вопрос, зачем это нужно? В Notepad++ есть Tidy, который форматирует по заказу, как тот же Tidy для au3. Никакие переходы строк не сделают такого форматирования. А для других случаев читабельное форматирование вроде как и никчему.
просто дело в том, что программа будет использоваться на нескольких машинах, и выполнять форматирование на каждой при помощью постороннего совта не предоставляется возможным :(
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Neldezheil
Хоть я и не вижу основания для форматирования (любой человек пытающийся править разметку найдёт себе правильный инструмент, а не в блокноте), но возможен вариант выполнения регулярного выражения с заменой каждого закрывающегося тега на самого себя с переходом на новую строку.

Код:
#include <INet.au3>

SaveHTML("http://www.ya.ru", @ScriptDir&"\html.html")

Func SaveHTML($Link, $sFile)
    Dim $HTML
    $HTML = _INetGetSource($Link)
	
	;переходы строк после закрывающего тега
	;$HTML = StringRegExpReplace($HTML, "(<\/\w+>)", "\1"&@CRLF)
	
	;переход строки перед открывающим тэгом
	$HTML = StringRegExpReplace($HTML, "(<\w+)", @CRLF&"\1")

	
    $File=FileOpen ($sFile, 2)
    FileWrite($File, $HTML)
    FileClose($File)
EndFunc


переменную $aHTML переименовал в $HTML, это же не массив.
 
Автор
N

Neldezheil

B like Bee
Сообщения
27
Репутация
3
AZJIO сказал(а):
Neldezheil
Хоть я и не вижу основания для форматирования (любой человек пытающийся править разметку найдёт себе правильный инструмент, а не в блокноте), но возможен вариант выполнения регулярного выражения с заменой каждого закрывающегося тега на самого себя с переходом на новую строку.

Код:
#include <INet.au3>

SaveHTML("http://www.ya.ru", @ScriptDir&"\html.html")

Func SaveHTML($Link, $sFile)
    Dim $HTML
    $HTML = _INetGetSource($Link)
	
	;переходы строк после закрывающего тега
	;$HTML = StringRegExpReplace($HTML, "(<\/\w+>)", "\1"&@CRLF)
	
	;переход строки перед открывающим тэгом
	$HTML = StringRegExpReplace($HTML, "(<\w+)", @CRLF&"\1")

	
    $File=FileOpen ($sFile, 2)
    FileWrite($File, $HTML)
    FileClose($File)
EndFunc


переменную $aHTML переименовал в $HTML, это же не массив.

Пробовал, в данном случае получается такой же результат, только +1 Chr(13)
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Neldezheil
Neldezheil сказал(а):
@CRLF - это и есть Chr(13)+Chr(10), убери лишнее и будет как требуется. Например оставь @LF вместо @CRLF в регулярном выражении.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Neldezheil
Попробуйте так:
Код:
#include <IE.au3>

SaveHTML("www.ya.ru", @ScriptDir & "\Document.html")

Func SaveHTML($sLink, $sPath)
    Dim $aHTML
    $oIE = _IECreate($sLink)
    $aHTML = _IEDocReadHTML($oIE)
	
#cs *** для подмены относительных путей
	$oImgs = _IEImgGetCollection($oIE)
	$iNumImg = @extended ; количество картинок в документе. для контроля!
	For $oImg In $oImgs
		; здесь можно вставить регулярное выражение для замены в $aHTML всех относительных путей на $oImg.src
		; к сожалению, я не силён в RegExp
	Next
#ce *** 

	$dFile = FileOpen($sPath,130)
	If $dFile = -1 Then Exit
	FileWrite($dFile, $aHTML)
	FileClose($dFile)
EndFunc
 
Верх