Какой самый эффективный способ получить эти данные, тысячи раз? - PullRequest
1 голос
/ 15 марта 2011

Каков наилучший способ получить следующие данные (через 4,0 метра после тега </b>) с помощью PHP DOMDocument-> loadHTML () системы?Я предполагаю какой-нибудь селектор стилей CSS?

(LINE 240, always 240) <b>Current Price:</b> 4.0m

Я просматривал документацию, но, честно говоря, это все совершенно чуждо мне!Кроме того, как я смогу получить эти данные для тысяч страниц с таких URL-адресов, как:

http://site.com/q=item/viewitem.php?obj=11928

Известны минимальные / максимальные значения obj=# (сколько страницМне нужно будет поцарапать), и я хочу захватить их все, постепенно, и вывести name description и price (пока не сильно обеспокоен процентным увеличением / падением) в базу данных MySQL, поэтомуЯ могу взять его оттуда и отобразить на моем сайте.

Вот основной блок кода, который меня интересует:

<div class="subsectionHeader"> 
<h2> 
Item Name
</h2> 
</div> 
<div id="item_additional" class="inner_brown_box">  
Description of item goes here.
<br> 
<br> 
<b>Current Price:</b> 4.0m
<br><br> 
<b>Change in Price:</b><br> 
<span> 
<b>30 Days:</b> <span class="rise">+2.5%</span> 
</span> 
<span class="spaced_span"> 
<b>90 Days:</b> <span class="drop">-30.4%</span> 
</span> 
<span class="spaced-span"> 
<b>180 Days:</b> <span class="drop">-33.3%</span> 
</span> 
<br class="clear"> 
</div> </div> <div class="brown_box main_page"> 
<div class="subsectionHeader"> `

Если кто-нибудь может дать какие-нибудь скелетные подсказки о том, какчтобы пойти по этому поводу, было бы очень признательно!

Ответы [ 3 ]

1 голос
/ 15 марта 2011

Разбор HTML с помощью регулярных выражений обычно плохая идея, но в вашем случае это может быть правильным / простым способом.Это достаточно быстро и, возможно, более гибко, чем разбиение на фрагменты с помощью шаблонов strpos и простого текста.

Попробуйте этот пример с исходным HTML, приведенным выше:

//checked with php 5.3.3
if (preg_match('#<h2>(?P<itemName>[^>]+)</h2>.*?<div[^>]+id=([\'"])item_additional(\2)[^>]*>\s*(?P<description>[^<]+).*?<b>\s*Current\s+Price\s?:?</b>\s*(?P<price>[^<]+)#six',$src, $matches))
{
    print_r($matches);
} 

Регулярные выражения могут выглядеть слишком сложными, но с документированиеми хорошие инструменты, такие как RegexBuddy или Expresso, любой может написать простой;)

0 голосов
/ 15 марта 2011

Разбор DOM - самый надежный способ сделать это.

Если вам нужен самый быстрый способ и вы знаете, что структура HTML согласована, , вероятно, будет быстрее использовать strpos для поиска смещений. Однако, более вероятно, что он сломается, если изменится структура страницы. Как то так:

$needles = array(
  'name' => "<div class=\"subsectionHeader\">\n<h2>\n"
  'description' => "<div id=\"item_additional\" class=\"inner_brown_box\">\n"
  'price' => "<b>Current Price:</b> "
);
$buffer = file_get_contents("http://site.com/q=item/viewitem.php?obj=1234");
$result = array();
foreach ($needles as $key => $needle) {
  $index1 = strpos($buffer, $needle);
  $index2 = strpos($buffer, "\n", $index1);
  $value = substr($buffer, $index1, $index2 - $index1);
  $result[$key] = $value;
}

Вам нужно будет правильно подобрать иглы, включая любые пробелы.

0 голосов
/ 15 марта 2011

Вы можете использовать Simple HTML DOM Parser - http://simplehtmldom.sourceforge.net/

Извлечь содержимое, используя:

echo file_get_html('http://www.google.com/')->plaintext; 

И затем найти 4,0 м, используя функцию PHP str.

...