2010-06-15 5 views
0

Я пытаюсь извлечь значение пробега с разных страниц ebay, но я застрял, поскольку, похоже, слишком много шаблонов, потому что страницы немного разные. Поэтому я хотел бы знать, можете ли вы помочь мне с лучшей моделью. Некоторые примеры элементов являются следующие: http://cgi.ebay.com/ebaymotors/1971-Chevy-C10-Shortbed-Truck-/250647101696?cmd=ViewItem&pt=US_Cars_Trucks&hash=item3a5bbb4100 http://cgi.ebay.com/ebaymotors/1987-HANDICAP-LEISURE-VAN-W-WHEEL-CHAIR-LIFT-/250647101712?cmd=ViewItem&pt=US_Cars_Trucks&hash=item3a5bbb4110 http://cgi.ebay.com/ebaymotors/ws/eBayISAPI.dll?ViewItemNext&item=250647101696
Пожалуйста, смотрите образцы по следующей ссылке (я до сих пор не могу понять, как избежать HTML здесьregex, php, preg_match

 
http://pastebin.com/zk4HAY3T 

Однако они не являются достаточно много, как кажется, есть еще новые паттеры ....

+1

Я бы больше читал в regexp, так как способ, которым вы это делаете, определенно может быть улучшен. Все они могут быть выполнены с одним регулярным выражением для одного, и вы не должны пытаться сопоставить каждый атрибут и tr, но просто пропустите ту часть, где она имеет мили –

ответ

0

Это должно быть немного более общим - ему все равно, что внутри тегов html. Он работает на всех трех ссылках, которые вы указали.

/Mileage[^<]*<[^>]*><[^>]*>(.*?)\s*miles/i 

Конечно, в зависимости от каких-либо ограничений у вас могут быть лучшие способы, но это хорошая отправная точка.

Признавая дублирования там, вы могли бы упростить (логически, по крайней мере) немного больше:

/Mileage[^<]*(?:<[^>]*>){2}(.*?)\s*miles/i 

Вы ищете двух HTML тегов в строке между словами «Пробег» и «миль» , Это часть (?:<[^>]*>){2}. ?: сообщает, что не следует помнить эту последовательность, так что $matches[1] по-прежнему содержит номер, который вы ищете, а {2} указывает, что вы хотите точно сравнить предыдущую последовательность в два раза.

2

Don't use regular expressions to parse HTML. Даже для относительно простой вещи, такой как это, регулярные выражения заставляют вас сильно зависеть от точной разметки.

Вы можете использовать DOMDocument и XPath, чтобы захватить значение красиво, и это несколько более устойчивыми к изменениям на странице:

$doc = new DOMDocument(); 

    @$doc->loadHtmlFile($url); 

    $xpath = new DOMXpath($doc); 
    foreach ($xpath->query('//th[contains(., "Mileage")]/following-sibling::td') as $td) { 
    var_dump($td->textContent); 
    }

В XPath поиск запросов для <th>, который содержит слово «Пробег», то выбирает <td> s за ним.

Затем вы можете удалить суффикс miles и избавиться от запятых, используя str_replace или substr.

Смежные вопросы