Учусь парсить нужны советы

D
На сайте с 28.06.2008
Offline
1101
#11

Еще прошу совета - вот есть регулярка (.*) - любой символ 0 и более раз.

Но она не понимает пробелы. Как в нее добавить пробел? и еще нужно учесть "ничего"

чтобы получилось (пробел или несколько пробелов, а может и не быть пробела тогда тег сразу закрывается|любой символ 0 и более раз)

чтобы нагляднее https://regex101.com/r/OG8Aw4/1 почему регулярка

<p(\s*)www(.*)>(.*)</p>

вообще ничего не цепляет?

Я правильно понимаю что \s* - нет пробела, есть пробел, несколько пробелов?

S
На сайте с 30.09.2016
Offline
469
#12
Dram:
Еще прошу совета - вот есть регулярка (.*) - любой символ 0 и более раз.
Но она не понимает пробелы.

Понимает, наравне со всеми остальными.

Dram:
почему регулярка вообще ничего не цепляет?
Потому что нет соответствий.
Dram:
Я правильно понимаю что \s* - нет пробела, есть пробел, несколько пробелов?
Правильно.

Попробуй варианты

<p\s+.*www(.*)>(.*)</p>
<p.+www(.*)>(.*)</p>
Эти варианты захватывают, но по разным правилам, - смотря по тому, что интересует.
Отпилю лишнее, прикручу нужное, выправлю кривое. Вытравлю вредителей.
D
На сайте с 28.06.2008
Offline
1101
#13

\s+.* это я правильно понимаю - точно один или более пробелов + 1 или более символов

S
На сайте с 30.09.2016
Offline
469
#14

Правильнее сказать не символов, а любых символов. И любых - от 0 и больше. Даже вот так проще

<p\s.*www(.*)>(.*)</p>
Один пробел, а дальше любые символы, включая пробелы.
D
На сайте с 28.06.2008
Offline
1101
#15

Спасибо!!!!!!!!!!

L
На сайте с 25.12.2013
Offline
315
#16
Апокалипсис:
Для отладки регулярок очень рекомендую сервис: https://regex101.com/

А я загружаю нужный мне фрагмент для парсинга в NotePad++ и там тестирую регулярки.

Недорогой, надежный и отзывчивый VPS хостинг ( https://bit.ly/3eXUnNN ) Проверенная пуш партнерка с ежедневными выплатами ( https://vk.cc/9wLSrL)
melkozaur
На сайте с 06.04.2010
Offline
505
#17
_SP_:
распарсивать его целиком немного долго и геморно

Ну какой-нибудь Датакол быстро парсит, даже с кучей всяких замен и загрузкой фоток. Там просто надо норм. настроить, в первую очередь страницы определить конкретные, тогда летает.

Серверы в NL/US со скидкой 30% нашим читателям: E5-2650v4/10GB DDR4/240GB SSD/1 Gbps - от $20: https://ua-hosting.company/vps/nl SEO без компромиссов: https://seoleaks.net SEOLEAKS - продвижение сайтов: https://www.instagram.com/seoleaks
D
На сайте с 28.06.2008
Offline
1101
#18

Снова вопрос про регулярки, почему эта регуляка

<p\s*class(.*)more[^\s]>(.*)</p>

не цепляет эту конструкцию

<p class=\'more\' ><a href="interesting.php">подробнее...</a></p>

насколько я себе понимаю то что написал -это значит

сколько угодно пробелов после <p

затем что угодно между class и more

отсутствие пробелов после more

все что угодно внутри этого тега с данным классом.

Где ошибаюсь?

---------- Добавлено 18.05.2019 в 18:12 ----------

все - решил вопрос так -

<p\s*class(.*)more[^\s](.*)>(.*)</p>

или так даже лучше получилось

<p\s*class.{0,3}more[^\s](.*)>(.*)</p>
S
На сайте с 30.09.2016
Offline
469
#19
Dram:
почему эта регулярка
не цепляет эту конструкцию

Я всё-таки отвечу :)

По двум причинам не цепляет:

1. В class=\'more\' > пробел всё же есть.

2. [^\s] - это один символ, а их там больше.

D
На сайте с 28.06.2008
Offline
1101
#20

Итак регулярки начал понимать значительно лучше, перешел к curl

Делаю домашнее задание.

Есть 5 ссылок, нужно пройтись по ним курлом, вытащить title, h1 и текст и записать это в базу.

Вот наваял я код и не погу догнать два момента:

1. Какого лешего в базу пишется Array[1] вместо данных

2. Какого пишется два раза, я в упор не вижу где цикл повторяется. Вот что в базе:

<?php
$db = mysqli_connect('localhost', 'mysql', 'mysql', 'my_project')
or die ('Ошибка соединения с MySQL-сервером');

$links = [ 'http://code.mu/exercises/advanced/php/parsing/rabota-s-bibliotekoj-curl-v-php/1/1.php',
'http://code.mu/exercises/advanced/php/parsing/rabota-s-bibliotekoj-curl-v-php/1/2.php',
'http://code.mu/exercises/advanced/php/parsing/rabota-s-bibliotekoj-curl-v-php/1/3.php',
'http://code.mu/exercises/advanced/php/parsing/rabota-s-bibliotekoj-curl-v-php/1/4.php',
'http://code.mu/exercises/advanced/php/parsing/rabota-s-bibliotekoj-curl-v-php/1/5.php',
];

function getPageByUrl ($url)
{
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
$result = curl_exec($curl);
if ($result === false) { echo "Ошибка CURL: " . curl_error($curl);
return false;
} else {
return $result;
}
}

$i=0;
foreach ($links as $item){
$i++;
$pars = getPageByUrl ($item);
preg_match_all('~<title>(.*)</title>~m',$pars, $title, PREG_SET_ORDER, 0);
preg_match_all('~<h1>(.*)</h1>~m',$pars, $name, PREG_SET_ORDER, 0);
preg_match_all('~<div\s.*(.*)main(.*)>(.*)</h1>(.*)</div>~msU',$pars, $text, PREG_SET_ORDER, 0);

if ($i>=0 && $i<= count($links)) {
$db->query("INSERT INTO `page` (`id`, `name`, `h1`, `text`) VALUES ($i, '$title[0][1]', '$name[0][1]', '$text[0][4]');")
or die ('Ошибка запроса');

}
}

если вместо $db->query выведу запрос через echo - он выводиться 5 раз. От чего же в базу пишется два раза по 5 ?

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий