Я пытаюсь создать простое приложение оповещения для некоторых друзей.
В основном я хочу иметь возможность извлекать данные «цена» и «доступность акций» с веб-страницы, например, следующих двух:
Я сделал оповещение по электронной почте и sms-части, но теперь я хочу, чтобы получить количество и цену из веб-страниц (те 2 или любые другие), чтобы я мог сравнить доступные цены и количество и предупредить нас сделать заказ, если продукт находится между некоторыми порогами.
Я пробовал некоторое регулярное выражение (найдено в некоторых учебниках, но я тоже слишком n00b для этого), но не удалось получить эту работу, какие-либо хорошие советы или примеры?
$content = file_get_contents('http://www.sparkfun.com/commerce/product_info.php?products_id=9279'); preg_match('#<tr><th>(.*)</th> <td><b>price</b></td></tr>#', $content, $match); $price = $match[1]; preg_match('#<input type="hidden" name="quantity_on_hand" value="(.*?)">#', $content, $match); $in_stock = $match[1]; echo "Price: $price - Availability: $in_stock\n";
Это называется очисткой экрана, в случае, если вам требуется Google.
Я бы предположил, что вместо этого вы используете синтаксический анализатор dom и xpath. Сначала подайте HTML через HtmlTidy, чтобы убедиться, что это действительная разметка.
Например:
$html = file_get_contents("http://www.example.com"); $html = tidy_repair_string($html); $doc = new DomDocument(); $doc->loadHtml($html); $xpath = new DomXPath($doc); // Now query the document: foreach ($xpath->query('//table[@class="pricing"]/th') as $node) { echo $node, "\n"; }
Что бы вы ни делали: не используйте регулярные выражения для синтаксического анализа HTML или что-то не так . Вместо этого используйте синтаксический анализатор .
1-й вопрос, задающий этот вопрос, слишком детализирован. Во-вторых, извлечение данных с веб-сайта может быть нецелесообразным. Однако у меня есть намеки:
Используйте Firebug или Chrome / Safari Inspector для изучения содержимого HTML и шаблона интересной информации
Проверьте свой RegEx, чтобы узнать, соответствует ли это. Возможно, вам понадобится сделать это много раз (многопроходный синтаксический анализ / извлечение)
Записывайте клиента через cURL или даже намного проще, используйте file_get_contents (обратите внимание, что на некотором хостинге отключить загрузку URL-адресов с помощью file_get_contents)
Для меня лучше использовать Tidy для преобразования в действительный XHTML, а затем использовать XPath для извлечения данных вместо RegEx. Зачем? Поскольку XHTML не является регулярным, а XPath является очень гибким. Вы можете изучить XSLT для преобразования.
Удачи!
Вероятно, вам лучше всего загружать HTML-код в парсер DOM, подобный этому, и искать таблицу «ценообразования». Тем не менее, любые скребли, которые вы делаете, могут ломаться, когда они меняют свой макет страницы, и, вероятно, являются незаконными без их согласия.
Лучшим способом, однако, было бы поговорить с людьми, которые запустили сайт, и посмотреть, есть ли у них альтернативные, более надежные формы доставки данных (веб-службы, RSS или экспорт баз данных).
Самый простой способ извлечения данных с веб-сайта. Я проанализировал, что все мои данные покрыты только тегом, поэтому я подготовил это.
<?php include('simple_html_dom.php'); // Create DOM from URL, paste your destined web url in $page $page = 'http://facebook4free.com/category/facebookstatus/amazing-facebook-status/'; $html = new simple_html_dom(); //Within $html your webpage will be loaded for further operation $html->load_file($page); // Find all links $links = array(); //Within find() function, I have written h3 so it will simply fetch the content from <h3> tag only. Change as per your requirement. foreach($html->find('h3′) as $element) { $links[] = $element; } reset($links); //$out will be having each of HTML element content you searching for, within that web page foreach ($links as $out) { echo $out; } ?>
в<?php include('simple_html_dom.php'); // Create DOM from URL, paste your destined web url in $page $page = 'http://facebook4free.com/category/facebookstatus/amazing-facebook-status/'; $html = new simple_html_dom(); //Within $html your webpage will be loaded for further operation $html->load_file($page); // Find all links $links = array(); //Within find() function, I have written h3 so it will simply fetch the content from <h3> tag only. Change as per your requirement. foreach($html->find('h3′) as $element) { $links[] = $element; } reset($links); //$out will be having each of HTML element content you searching for, within that web page foreach ($links as $out) { echo $out; } ?>