2015-11-08 2 views
1

Я играл с cURL и xpath для некоторых webscraping. Я, наконец, получил свой код, как я хочу, но после попытки на другой стороне он остановился. Единственное, что я изменил, это путь и URL. Я совершенно новый и работаю с этим только неделю. Поэтому, медведь со мной, если это очевидный провал.Xpath-запрос не будет работать

Мой код:

<?php 
 
/*----Connection to Database----*/ 
 
include('wp-config.php'); 
 
mysql_connect(DB_HOST, DB_USER, DB_PASSWORD); 
 
mysql_select_db("db"); 
 

 
/*----US Dollar Index----*/ 
 
$url = "http://www.wsj.com/mdc/public/page/2_3023-fut_index-futures.html"; 
 
$userAgent = 'Googlebot/2.1 (http://www.googlebot.com/bot.html)'; 
 

 
// Make the cURL request 
 
$ch = curl_init(); 
 
curl_setopt($ch, CURLOPT_USERAGENT, $userAgent); 
 
curl_setopt($ch, CURLOPT_URL,$url); 
 
curl_setopt($ch, CURLOPT_FAILONERROR, true); 
 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
 
curl_setopt($ch, CURLOPT_AUTOREFERER, true); 
 
curl_setopt($ch, CURLOPT_RETURNTRANSFER,true); 
 
curl_setopt($ch, CURLOPT_TIMEOUT, 10); 
 
$html= curl_exec($ch); 
 
if (!$html) { 
 
\t echo "<br />cURL error number:" .curl_errno($ch); 
 
\t echo "<br />cURL error:" . curl_error($ch); 
 
\t exit; 
 
} 
 

 
// Parse the html into a DOMDocument 
 
$dom = new DOMDocument(); 
 
@$dom->loadHTML($html); 
 

 
// Grab all the MONTH on the page 
 
$xpath = new DOMXPath($dom); 
 

 
$data = $xpath->query("/html/body/div[6]/div[3]/div/table[9]/tbody/tr[position() >= 3 and position() <=6]"); 
 

 
//[position() >= 1 and position() <=13] 
 

 
// Searching for data 
 
$values = array(); 
 
foreach($data as $row) { 
 
\t $values[] = $row->nodeValue; 
 
} 
 

 
print_r($values); 
 

 
?> 
 
</body> 
 
</html>

+1

Сыворотка, вы говорите, что она остановлена, означает ли это, что сценарий вычеркнут, не возвратил контент, произошла ошибка .... и т. Д.?? – Rasclatt

+0

Извините, что не предоставил эту информацию. Сценарий не перегревал или не возвращал ошибку. Единственное, что отображается: «Array()» –

+0

, что вы имеете в виду, что вы «изменили путь и URL»? К чему вы его изменили? xpath, который у вас есть, действителен только для URL-кода вашего кода ... – drkthng

ответ

0

Я решил свою проблему, которая была дорогой. Путь firebug дал мне не был правильным для сайта. почему я не знаю.

1

Несколько вещей, которые приходят на ум. Вы проверили, как выглядит входящий html, есть ли у него что-то, что там не принадлежит? И есть ли xpath, который вы ищете правильно? По крайней мере, в этом старшем ответ, кажется, что диапазон для XPath должны быть приведены в виде

[position() >= 100 and not(position() > 200)]

https://stackoverflow.com/a/3355022/5526468

Edit: И теперь, когда я думаю об этом, это может быть возможно, что если есть меньше требуемого количества элементов в фактическом html, возможно, xpath оценивает выражение диапазона как false и, следовательно, ни один не найден с запросом?

+0

Я использовал firebug в firefox, чтобы скопировать xpath прямо из браузера. Поэтому я не знаю, смогу ли я ошибиться? Я попытался использовать ваше предложение для xpath, и он тоже не будет работать. Я все еще думаю, что он говорит то же самое, что и мой, но не уверен :) Я пробовал разные типы xpath, где я использую прямой путь к одному элементу вместо диапазона и он все еще не работает. –

+0

Я пробовал ваш код, и кажется, что он не может разобрать html, который он получает. Переменная $ html заполняется каким-то html (или хотя бы html-выглядящими данными), но когда вы пытаетесь загрузить его с помощью $ dom-> loadHTML ($ html), $ dom не будет анализировать его успешно. Я думаю, что ваш исходный код и xpath-запрос верны, но проблема заключается в веб-странице, которую вы пытаетесь проанализировать. Возможно, Firefox/Firebug исправляет html на лету, и поэтому вы можете получить правильный Xpath при использовании Firefox. – Oskari3000

+0

Хорошо, похоже, это может быть проблемой. Что я могу сделать, чтобы решить эту проблему, чтобы получить правильный html-код в моей переменной? –

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