Форум успешных вебмастеров - GoFuckBiz.com

  Форум успешных вебмастеров - GoFuckBiz.com > Бизнес-решения > Скрипты, программы и технические решения
Дата
USD/RUB59.2760
BTC/USD0.0000
Скрипты, программы и технические решения Обсуждаем скрипты, программы и новые технологии.

Закрытая тема
Опции темы Опции просмотра
Старый 21.03.2012, 17:16   #1
Rombl4
Ромыч
 
Аватар для Rombl4
 
Регистрация: 16.07.2008
Сообщений: 1,302
Бабло: $154950
По умолчанию Актуальная регулярка для гугла

Накатайте кто-нибудь регулярку для парсинга урлов гугла. Запарился ее уже подбирать самостоятельно.
Rombl4 вне форума  
Старый 21.03.2012, 17:38   #2
Credo
Senior Member
 
Регистрация: 11.04.2007
Сообщений: 372
Бабло: $58863
По умолчанию

что-то типа такого у меня работает.

PHP код:
$links=array();
$datafile_get_contents("урл поиска");
preg_match_all("#<li class=\"g\">(.*)</li>#siU",$data,$results);
//а потом в цикле вот так
$total=count($results[1]);
for(
$i=0;$i<$total);$i++){
    if(!
preg_match("#<h3 class=\"r\"><a.*href=\"(.*)\".*>.*</a></h3>#siU",$results[1][$i],$tmp)) continue;
        
// это не помню для чего, наверное можно удалить
    
if(preg_match("#^/search\?q=#siU",$tmp[1])) continue;
       
         
// очистка всякой левой фигни
    
$tmp[1]=str_replace("/url?q=","",$tmp[1]);
    
$tmp[1]=preg_replace("/&amp;sa=U&amp;ei=.*&amp;ved=.*&amp;usg=.*$/siU","",$tmp[1]);
    
array_push($links,$tmp[1]);
}

print_r($links); 
Credo вне форума  
Старый 21.03.2012, 17:58   #3
Rombl4
Ромыч
 
Аватар для Rombl4
 
Регистрация: 16.07.2008
Сообщений: 1,302
Бабло: $154950
ТС -->
автор темы ТС По умолчанию

Цитата:
Сообщение от Credo Посмотреть сообщение
что-то типа такого у меня работает.

PHP код:
 
Спасибо!

А если усложнить задачу, надо бы в одну строку регулярку сделать. У меня оба парсера на питоне, я хз как переделать по предложенному примеру.

Только эту строку можно подвергнуть модификации, ибо в другом случае все полетит к хуям:

PHP код:
re.findall(r'(?ism)<h3 class=\"r\"><a class=\"l\".*href=\".*url=(.*?)&ei.*\".*>'self.c.content
Я сейчас что-то такое пробую.
Rombl4 вне форума  
Старый 21.03.2012, 18:24   #4
Credo
Senior Member
 
Регистрация: 11.04.2007
Сообщений: 372
Бабло: $58863
По умолчанию

Цитата:
Сообщение от Rombl4 Посмотреть сообщение
А если усложнить задачу, надо бы в одну строку регулярку сделать. У меня оба парсера на питоне, я хз как переделать по предложенному примеру.
так если знаеш питон то переделать нет проблем.

первая регулярка
PHP код:
 preg_match_all("#<li class=\"g\">(.*)</li>#siU",$data,$results); 
разбивает страницу на блоки (в массиве results[1] складываются). в каждом блоке ссылка, снипет и все остальное.

количество блоков = количеству ссылок на странице.

потом в обычном цикле проходишся по блоках и выдергиваеш уже ссылку вот этой регуляркой (или снипет уже другой регуляркой)
PHP код:
if(!preg_match("#<h3 class=\"r\"><a.*href=\"(.*)\".*>.*</a></h3>#siU",$results[1][$i],$tmp)) continue; 
в $tmp[1] и будет ссылка но она может быть с мусором, его потом можно почистить.

короче если в питоне есть обычный цикл for то не вижу проблемы.


я в одну строку не заморачивался, надо было быстро сделать - сделал. работает и ладно ))
Credo вне форума  
Старый 21.03.2012, 18:31   #5
Rombl4
Ромыч
 
Аватар для Rombl4
 
Регистрация: 16.07.2008
Сообщений: 1,302
Бабло: $154950
ТС -->
автор темы ТС По умолчанию

Да я в питоне не шарю совсем, потому и застрял. Но все равно спасибо, по рабочему образцу легче будет разобраться.
Rombl4 вне форума  
Старый 21.03.2012, 18:55   #6
Rombl4
Ромыч
 
Аватар для Rombl4
 
Регистрация: 16.07.2008
Сообщений: 1,302
Бабло: $154950
ТС -->
автор темы ТС По умолчанию

Вот таким макаром парсит, но что-то очень мало, должно отдать 100 ссылок, но вместо этого всего две:

PHP код:
re.findall(r'(?ism)<h3 class=\"r\"><a.*href=\"/url\?q=(.*?)/&amp;sa=U&amp;ei=.*&amp;ved=.*&amp;usg=.*\".*>.*</a></h3>'self.c.content

Последний раз редактировалось Rombl4; 21.03.2012 в 19:02.
Rombl4 вне форума  
Старый 21.03.2012, 19:16   #7
Rombl4
Ромыч
 
Аватар для Rombl4
 
Регистрация: 16.07.2008
Сообщений: 1,302
Бабло: $154950
ТС -->
автор темы ТС По умолчанию

upd. Теперь заебись все спарсило

PHP код:
re.findall(r'(?ism)<h3 class=\"r\"><a.*?href=\"/url\?q=(.*?)&amp.*?\".*?>.*?</a></h3>'self.c.content
Rombl4 вне форума  
Старый 21.03.2012, 21:03   #8
shoo
Member
 
Регистрация: 26.12.2011
Сообщений: 63
Бабло: $12170
По умолчанию

Кстати заметил, иногда гугл возвращает выдачу не в блоках <li class="g"></li>, а просто в <p></p>. И ссылки при этом находятся в <h3> без атрибута class="r"
Но это видимо из-за рандомных юзерагентов при парсинге.

И еще иногда какого-то хуя добавляет пустые блоки <li class="g"></li>
__________________
Скрипты / #jabber [email protected] #icq 6ноль767два477
shoo вне форума  
Старый 21.03.2012, 21:37   #9
inkubus
Senior Member
 
Аватар для inkubus
 
Регистрация: 11.02.2010
Сообщений: 935
Бабло: $176795
По умолчанию

Цитата:
Сообщение от shoo Посмотреть сообщение
Кстати заметил, иногда гугл возвращает выдачу не в блоках <li class="g"></li>, а просто в <p></p>. И ссылки при этом находятся в <h3> без атрибута class="r"
Но это видимо из-за рандомных юзерагентов при парсинге.

И еще иногда какого-то хуя добавляет пустые блоки <li class="g"></li>
не только из-за юзер-агентов а еще и из-за прокси
inkubus вне форума  
Старый 21.03.2012, 21:48   #10
WebNinja
grablab.org
 
Аватар для WebNinja
 
Регистрация: 18.09.2007
Адрес: Thailand
Сообщений: 4,921
Бабло: $322214
Отправить сообщение для WebNinja с помощью ICQ Отправить сообщение для WebNinja с помощью Skype™
По умолчанию

html не поддается разбору регулярными выражениями!

html - не регулярная грамматика, а регулярные выражения парсят только регулярные.

сейчас не 2007 год парсить гугл регулярками нормально не получится.
http://stackoverflow.com/questions/1...contained-tags

Цитата:
You can't parse [X]HTML with regex. Because HTML can't be parsed by regex. Regex is not a tool that can be used to correctly parse HTML. As I have answered in HTML-and-regex questions here so many times before, the use of regex will not allow you to consume HTML. Regular expressions are a tool that is insufficiently sophisticated to understand the constructs employed by HTML. HTML is not a regular language and hence cannot be parsed by regular expressions. Regex queries are not equipped to break down HTML into its meaningful parts.
WebNinja вне форума  
Закрытая тема



Опции темы
Опции просмотра