Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   экстрагирование ссылок по признаку из html-файла (http://forum.oszone.net/showthread.php?t=283080)

ruslaw 03-06-2014 12:18 2359334

экстрагирование ссылок по признаку из html-файла
 
Имеется папка с html-файлами, содержащими разнообразные гиперссылки.
Из этих ссылок интересуют ссылки типа "http://xyz-user.livejournal.com/24701.html?thread=1004158#t1004158"
Можно ли написать js/vbs файл, который извлекал бы такие ссылки из всех html-файлов этой папки по признакам - они в кавычках, содержат блок html?thread= и http://xyz-user.livejournal.com/ (последнее впрочем не принципиально т.к. блок html?thread= содержится только среди ссылок с http://xyz-user.livejournal.com/) и выдавал бы текстовый файл со списком таких ссылок?

Iska 03-06-2014 18:09 2359506

Можно.

El Sanchez 05-06-2014 13:59 2360313

ruslaw, пробуйте:
читать дальше »

Код:

Option Explicit

Const ForReading = 1, ForWriting = 2
Dim objArgs, objFSO, objFolder, objFile, objTextStream, objResultTextStream
Dim objRegExp, objMatches, objMatch
Dim strFolder

'Check arguments count
Set objArgs = WScript.Arguments
If objArgs.Count = 0 Then
        WScript.Echo "Syntax: "        & WScript.ScriptName & " ""path to folder"""
        WScript.Quit(1)
End If

'Check first argument is folder
Set objFSO = CreateObject("Scripting.FileSystemObject")
strFolder = WScript.Arguments(0)
If Not objFSO.FolderExists(strFolder) Then
        WScript.Echo "Specified folder " & strFolder & " not exists"
        WScript.Quit(1)
End If

'Create regexp object
Set objRegExp = CreateObject("VBScript.RegExp")
objRegExp.Pattern = """http:\/\/[\w-]+\.livejournal.com\/\d+\.html\?thread\=\d+#t\d+"""
objRegExp.Global = True
objRegExp.IgnoreCase = True

'Create result log-file
Set objResultTextStream = objFSO.OpenTextFile(objFSO.GetParentFolderName(WScript.ScriptFullName) & "\result.log", ForWriting, True)

'Enumerate html-files in folder
Set objFolder = objFSO.GetFolder(strFolder)
For Each objFile in objFolder.Files
        If (UCase(objFSO.GetExtensionName(objFile.Name)) = "HTML") And (objFile.Size > 0) Then
                'Open file
                Set objTextStream = objFSO.OpenTextFile(objFile.Path, ForReading)
                'Read file and get matches
                Set objMatches = objRegExp.Execute(objTextStream.ReadAll)
                For Each objMatch In objMatches
                        'Write match
                        objResultTextStream.WriteLine objMatch.Value
                Next
        End If
Next

'Close result log-file
objResultTextStream.Close

'Cleanup
Set objArgs = Nothing
Set objFSO = Nothing
Set objFolder = Nothing
Set objFile = Nothing
Set objTextStream = Nothing
Set objResultTextStream = Nothing
Set objRegExp = Nothing
Set objMatches = Nothing
Set objMatch = Nothing
Set strFolder = Nothing

WScript.Echo "Done."


ruslaw 06-06-2014 19:08 2360877

А как указать папку?
Я подставил вместо строки path to folder адрес C:\test
При нажатии на файл отвечает Windows Script Host подсказкой такого типа: Syntax: Threads.vbs "C:\test"
Если имя папки не подставлять то ответ будет такой: Syntax: Threads.vbs "path to folder"
Файл помещал и в папку и в корень.

El Sanchez 06-06-2014 21:51 2360943

ruslaw, скрипт принимает путь к папке с html-файлами в качестве параметра. Открываете консоль из того места, где лежит скрипт, пишете threads.vbs "путь к папке с файлами". После обработки файлов рядом с скриптом будет результат в виде файла result.log.

ruslaw 07-06-2014 00:11 2360996

Сработало. Прекрасно!
А нельзя ли сделать аналогичный скрипт, который извлекал бы из текстовых файлов в некоторой папке все строки заключенные между двумя определенными наборами символов, например keyword1 и keyword2, причем в любом из файлов таких строк будет не одна, и в строках возможны пробелы.

Iska 07-06-2014 01:44 2361032

Цитата:

Цитата El Sanchez
Открываете консоль из того места, где лежит скрипт, пишете threads.vbs "путь к папке с файлами". »

В данном случае можно также просто перетащить папку на скрипт.

El Sanchez 08-06-2014 10:21 2361450

Цитата:

Цитата ruslaw
А нельзя ли сделать аналогичный скрипт, который извлекал бы из текстовых файлов в некоторой папке все строки заключенные между двумя определенными наборами символов, например keyword1 и keyword2, причем в любом из файлов таких строк будет не одна, и в строках возможны пробелы. »

ruslaw, можно. В каких файлах искать? Как выглядят keyword1 и keyword2? Без дополнительных данных все ответы будут такими же, как в сообщении #2.

Цитата:

Цитата Iska
В данном случае можно также просто перетащить папку на скрипт. »

Iska, никаких легких путей, только комстрока, только хардкор :)

Iska 08-06-2014 10:54 2361459

Цитата:

Цитата El Sanchez
Iska, никаких легких путей, только комстрока, только хардкор »

Народ измучен нарзаном избалован GUI.

ruslaw 09-06-2014 00:18 2361829

имеются ввиду html-файлы в папке.
keyword1 = "level":1,
keyword2 = "expandchilds"
в обоих случаях кавычки входят в состав keywords

El Sanchez 09-06-2014 10:58 2361931

ruslaw, в скрипте перепишите 2 строки:
Код:

'objRegExp.Pattern = """http:\/\/[\w-]+\.livejournal.com\/\d+\.html\?thread\=\d+#t\d+"""
objRegExp.Pattern = "(""level"":1,)(.+?)(""expandchilds"")"

...

'objResultTextStream.WriteLine objMatch.Value
objResultTextStream.WriteLine objMatch.SubMatches(1)


ruslaw 10-06-2014 10:45 2362370

ОК! Спасибо.


Время: 14:47.

Время: 14:47.
© OSzone.net 2001-