Что нового

Извлечение всех url из текстового файла

o_nix

Новичок
Сообщения
35
Репутация
1
Собственно задачка вроде проста но немогу понять как решить.
out.txt
Код:
ъБЧФТБ, Ч РЕТЧЩК ДЕОШ иБГХ ВБУЕ, ТПУУЙСОЙО бМБО зБВБТБЕЧ ЧУФТЕФЙФУС
У ЬУФПОГЕН лБКДП иЕЧЕМШУПОПН (вБМФ). * чемпыпууе*
неоде
(жТБОГЙС). нХЦУЛБС НОПЗПДОЕЧОБС ЧЕМПЗПОЛБ
``рБТЙЦ-оЙГГБ''.
4-К ЬФБР*
нпофелбфйой
фетне (йФБМЙС). нХЦУЛБС НОПЗПДОЕЧОБС ЧЕМПЗПОЛБ
``фЙТТЕОП-бДТЙБФЙЛП''.
2-К ЬФБР * тйелб (иПТЧБФЙС).
ъБИБТ еЖЙНЕОЛП (хЛТБЙОБ) Й вББДХТ дЦПВБЧБ (зТХЪЙС), ОБВТБЧ РП 5,5
ПЮЛБ ЙЪ 6, ЧОПЧШ ЧПЪЗМБЧЙМЙ ФХТОЙТОХА ЗПОЛХ ОБ 11-Н МЙЮОПН
ЮЕНРЙПОБФЕ еЧТПРЩ. * рбтху*
плмеод
 .
чЮЕТБ ЗПОЛЙ Louis Vuitton Trophy ОЕ РТПЧПДЙМЙУШ - ЪОБНЕОЙФХА ТЕЗБФХ
ПУФБОПЧЙМ ЫФПТНПЧПК ЧЕФЕТ, УМЙЫЛПН ПРБУОЩК ДМС МПДПЛ ЛМБУУБ лХВЛБ
``бНЕТЙЛЙ''. * летмйоз*
жмйну
(ыЧЕКГБТЙС). юЕНРЙПОБФ НЙТБ.
нПМПДЕЦОЩЕ
УВПТОЩЕ. зТХРРПЧПК ФХТОЙТ * мЙЗБ
ЮЕНРЙПОПЧ. цЕОЭЙОЩ. 1/4 ЖЙОБМБ. пФЧЕФОЩЕ НБФЮЙ * овб.
тЕЗХМСТОЩК ЮЕНРЙПОБФ * лХВПЛ
еЧТПРЩ. цЕОЭЙОЩ. 1/2 ЖЙОБМБ. рЕТЧЩЕ НБФЮЙ * ипллек у
нсюпн*
юЕНРЙПОБФ
тПУУЙЙ. чЩУЫБС МЙЗБ * йодйбо-хьмму.
нХЦУЛПК ФХТОЙТ BNP Paribas Open*
йодйбо-хьмму.
цЕОУЛЙК ФХТОЙТ BNP Paribas Open*
гатйи.
чЕФЕТБОУЛЙК ФХТОЙТ BNP Paribas Zurich Open
ЙЪ УЕТЙЙ
ATP Champions Tour*
зТХРРБ
б*
зТХРРБ
ч * оим.
тЕЗХМСТОЩК ЮЕНРЙПОБФ * нбобнб (вБИТЕКО).
фЕИОЙЮЕУЛЙЕ ДЕМЕЗБФЩ нЕЦДХОБТПДОПК БЧФПЖЕДЕТБГЙЙ FIA РТЙЪОБМЙ
ЛПОУФТХЛГЙА ЪБДОЙИ ЬМЕТПОПЧ ``нБЛМБТЕОБ'' нт 4/25 УППФЧЕФУФЧХАЭЕК
ФЕИОЙЮЕУЛПНХ ТЕЗМБНЕОФХ. * опчпуйвйтул
 .
ч ВМЙЦБКЫЕЕ ЧТЕНС Ч ТХЛПЧПДУФЧЕ ``уЙВЙТЙ''" />
</head><body alink="#000000" bgcolor="#ffffff" link="#660000" text="#000000" vlink="#000000" >
<center>
<table summary="" cellspacing="4" cellpadding="0" border="0" bgcolor="#ffffff" style="background-color: #ffffff; background-image: ;" class="weath">
<!-- 17441 -->
<tr valign="top"><td align="right" bgcolor="#ffffff" background="" style="background-color: #ffffff; background-image: ; border: dotted 1px #dddddd; padding: 3px;">
<a href="http://link.subscribe.ru/subscribe/158618/13799938/sport.news.express,1671/20100313110219/b7MiPcd1qADPKulvgjH6BQuicnrhrm"><font size="2" color="#0000ff" face="Arial" style="font-family: Arial, Helvetica, sans-serif;  font-size:12px; color:#0000ff; text-decoration:none;"><b>Speak Up - ФПМШЛП Ч НБТФЕ ПВХЮЕОЙЕ БОЗМЙКУЛПНХ ЧЕУОПК Ч РПДБТПЛ!</b></font></a><IMG src="http://anet.tradedoubler.com/anet?type(inv)loc(15611)g(17862764)" border=0 height=1 width=1 alt=""></td></tr>
<tr><td width="100%" bgcolor="#ffffff" style="background-color: #ffffff; background-image: ; border: solid 1px #dddddd;">
<table summary="" width="100%" border="0" bgcolor="#ffffff" style="background-color: #ffffff; background-image: ;" cellspacing="0" cellpadding="0" class="weath"><tr valign="middle" align="center">
<td rowspan="2" width="185" valign="middle" align="left"><a href="http://subscribe.ru/"><img src="http://subscribe.ru/img/issue/_logo.gif" width="185" height="52" alt="Subscribe.Ru" border="0"></a></td>
<td width="100%" valign="middle" align="center"><p><font face="Arial, Helvetica, sans-serif" size="3" color="#000000" style="color:#000000; font-family: Arial, Helvetica, sans-serif; font-size:14px; font-weight: bold; text-decoration: none;"><b style="color:#000000; font-family: Arial, Helvetica, sans-serif; font-size:14px; font-weight: bold; text-decoration: none;">уЧЕЦЙК ОПНЕТ &quot;уь&quot;</b></font><img src="http://image.subscribe.ru/1.gif/subscribe/sport.news.express,1671/20100313110219/=4Vm4W34XJ0004Vw/m13799938" alt="" height="1" width="1" border="0"><img src="http://www.tns-counter.ru/V13a****subscribe_ru/ru/KOI8-R/tmsec=subscribe_other/" width="1" height="1" alt=""/></p></td>
<td width="10"></td>
</tr>
<tr><td align="right" width="100%" colspan="2">
<a href="http://subscribe.ru/archive/sport.news.express/201003/13110219.html?clearview&[email protected]&uuid=cPtUE9SrHsnAott+IAq7VA"><font size="2" color="red" style="color: red; font-size: 11px; font-family: Arial, Helvetica, sans-serif;">оБЦНЙФЕ, ЕУМЙ ТБУУЩМЛБ ПФПВТБЦБЕФУС ОЕЛПТТЕЛФОП ЙМЙ ВЕЪ ЛБТФЙОПЛ</font></a> 
</td></tr>
</table>
Это лиш малый кусок файла ... может быть и 10-30 мб

Код:
$message = FileRead('out.txt')
$link = StringRegExpReplace($message, '(http://[\w|-|\.|/]*)', '\1')
ConsoleWrite($link & @CRLF)


C таким кодом что находит на то и заменяет а как извлеч найденное неужели нет такой спец опции ???... на выходе должны получится только ссылки - каждая с новой строки.

Подскажите правильный путь ... StringRegExp + в цикле вывод полученного массива??
 

amel27

Продвинутый
Сообщения
146
Репутация
55
Код:
#include <array.au3>

$a = StringRegExp(FileRead('out.txt'),'"(http://[^"]+)"',3)

_ArrayDisplay($a)
 
Автор
O

o_nix

Новичок
Сообщения
35
Репутация
1
amel27
ну собственно именно это я имел ввиду в последней строчке неужели более цивилизованного подхода нет ??

Как потом этот array в файл записать ... ?? в цикле считывая каждый отдельный элемент массива??
 
Автор
O

o_nix

Новичок
Сообщения
35
Репутация
1
Типа так уже сделал но имхо это изврат какойто :D
Код:
$mass = UBound($a)-1

For $i = $mass to 0 Step -1
ConsoleWrite($a[$i] & @CR)
Next


щас изучим :smile:
 
Автор
O

o_nix

Новичок
Сообщения
35
Репутация
1
Возможно, но дело в том что обработка будет идти целым списком regexp
Когда столкнулся с записью массива в файл исходное почерпнул отсюда
http://autoit-script.ru/index.php?topic=1282.msg9247#msg9247

Хотя первый мой вариант был какраз с StringRegExp

_FileWriteFromArray - хорошая штука ... :smile:
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 224
Репутация
2 344
amel27 [?]
изврат - это использовать StringRegExpReplace для таких входных данных
И всё таки:

Код:
$sRead = StringRegExpReplace(FileRead("In.txt"), '(?s).*?"(http://[^"]+)".*?|.*', '\1' & @CRLF)

$hFile = FileOpen("Out.txt", 2)
FileWrite($hFile, StringStripWS($sRead, 3))
FileClose($hFile)

;D
 
Автор
O

o_nix

Новичок
Сообщения
35
Репутация
1
CreatoR - зубодробительная регулярка получилась :D так сходу и неразберёшся


Данная регулярка работает толко если url в кавычках - далеко невсегда так, бывают url и без кавычек они тоже нужны. Без чётких ограничителей регулярка ещё распухнет :D
 

Garrett

Модератор
Локальный модератор
Сообщения
3 999
Репутация
964
Как я понял, ваши документы это HTML сохранённый в TXT?
Тогда ищите все теги
Код:
<a>...</a>
Это и есть ваши ссылки. Правда, с рег. выражениями я на Вы, поэтому помочь не смогу :smile:, но думаю рег. шаблон будет проще.
 
Автор
O

o_nix

Новичок
Сообщения
35
Репутация
1
Нет ... не всё так просто ..
хочется сделать универсальное ... теги <a> тоже невсегда есть... всегда есть только url с неисвестным мусором вокруг:D
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 224
Репутация
2 344
o_nix [?]
всегда есть только url с неисвестным мусором вокруг
Вот нужно определиться с тем, что является мусором, а что нет. Если кавычки это не разделитель, тогда что является разделителем, по каким параметрам искать конец ссылки?


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

Код:
$sRead = FileRead("In.txt")

$sUrl_Delims = '"<>\s'
$sUrl_Protocol = '(?:https?|ftp|rtsp|mms|xmpp)://' ;'[a-zA-Z]{3,5}://' ;All characters with lenght of 3 to 5 (http, https, ftp, etc.).
$sUrl_Pattern = '(?s).*?(' & $sUrl_Protocol & '[^' & $sUrl_Delims & ']+).*?|.*'

$sRead = StringRegExpReplace($sRead, $sUrl_Pattern, '\1' & @CRLF)

$hFile = FileOpen("Out.txt", 2)
FileWrite($hFile, StringStripWS($sRead, 3))
FileClose($hFile)


Разделители можно указать в переменной $sUrl_Delims, поддерживаемые протоколы в $sUrl_Protocol.
 

Garrett

Модератор
Локальный модератор
Сообщения
3 999
Репутация
964
CreatoR [?]
Вот нужно определиться с тем, что является мусором, а что нет. Если кавычки это не разделитель, тогда что является разделителем, по каким параметрам искать конец ссылки?
Лучше и не скажешь ;D
 
Автор
O

o_nix

Новичок
Сообщения
35
Репутация
1
Легко сказать "определится с мусором" но трудно сделать :smile:
как насчёт того что там и катайские иероглифы могут быть ??? :D

На мой взгляд сам url - наиболее "описуемая" часть искомого уравнения :smile: проще описать что входит в url чем описать то что НЕвходит

Пока сделал так

Код:
$link = StringRegExp(FileRead('mail_out.txt'),'(htt[p|ps]://[\w|\d|\-|\.|/|\?|=|_|@|&|,|:]*)',3)
$link2=_ArrayUnique($link)

_FileWriteFromArray('temp.txt', $link2)

$link3 = StringRegExp(FileRead('temp.txt'),'(?m)^.*[gif|jpg]',3)

_ArrayDisplay($link3)


Все возможные урлы извлекает замечательно но мне найденный массив нада ещё обрабатывать. столкнулся с тем что массивы нельзя обрабатывать регулярками. Даже после превращения в строку через _ArrayToString бывший массив необрабатывается регуляркой, непонимаю почему так. Пришлось ввести temp.txt который служит буфером для данных - иначе заставить работать регулярки неудалось.

И ещё вопрос по регуляркам в AutoIT,
$link3 - должен содержать все строки заканчивающиеся на gif или jpg, но этого непроисходит полностью выдаёт только строки с gif и плюс несколько строк только с jpg - без захватывания начальной части строки.

Конструкция [gif|jpg] - работает в AutoIT непонятно как :(

Решается вписывание полной регулярки '(?m)^.*gif|^.*jpg' - но это крайне неудобно, подскажите как правильно сделать ?? Неможет быть чтобы [gif|jpg] неработало ... скорее на глюк похоже чем на фитчу :(
 

Belfigor

Модератор
Локальный модератор
Сообщения
3 578
Репутация
934
damien2008
убери ка с аватара знак группы ботоводов. Ты в ней не состоишь.
 
Верх