2015-10-30 2 views
1

Я пытаюсь получить общее годовое значение солнечного облучения и других значений из таблицы, которую я получаю с завитки из европейского pv_gis.regex php найти данные в таблице

В таблице я получаю:

<table class=data_table border="1" width="300" > 
<tr> <td> Jan </td><td align="right">2.27</td><td align="right">70.3</td><td align="right">2.86</td><td align="right">88.5</td></tr> 
<tr> <td> Feb </td><td align="right">2.79</td><td align="right">78.0</td><td align="right">3.56</td><td align="right">99.7</td></tr> 
<tr> <td> Mar </td><td align="right">3.59</td><td align="right">111</td><td align="right">4.74</td><td align="right">147</td></tr> 
<tr> <td> Apr </td><td align="right">4.23</td><td align="right">127</td><td align="right">5.68</td><td align="right">171</td></tr> 
<tr> <td> May </td><td align="right">4.46</td><td align="right">138</td><td align="right">6.13</td><td align="right">190</td></tr> 
<tr> <td> Jun </td><td align="right">4.53</td><td align="right">136</td><td align="right">6.38</td><td align="right">191</td></tr> 
<tr> <td> Jul </td><td align="right">4.74</td><td align="right">147</td><td align="right">6.70</td><td align="right">208</td></tr> 
<tr> <td> Aug </td><td align="right">4.59</td><td align="right">142</td><td align="right">6.53</td><td align="right">202</td></tr> 
<tr> <td> Sep </td><td align="right">4.32</td><td align="right">130</td><td align="right">5.96</td><td align="right">179</td></tr> 
<tr> <td> Oct </td><td align="right">3.63</td><td align="right">113</td><td align="right">4.87</td><td align="right">151</td></tr> 
<tr> <td> Nov </td><td align="right">2.64</td><td align="right">79.1</td><td align="right">3.41</td><td align="right">102</td></tr> 
<tr> <td> Dec </td><td align="right">2.15</td><td align="right">66.5</td><td align="right">2.72</td><td align="right">84.3</td></tr> 
<tr><td colspan=5> </td></tr> 
<tr><td><b> Yearly average </b></td><td align="right"><b>3.67 </b></td><td align="right"><b>111 </b></td></td><td align="right"><b>4.97 </b></td><td align="right"><b>151 </b></td></tr> 
<tr><td><b>Total for year</b></td><td align="right" colspan=2 ><b> 1340 </b> </td> <td align="right" colspan=2 ><b> 1810 </b> </td> </tr> 
</table> 

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

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

Я получаю бесконечную строку чисел, удаляя все TR и TD, но в этот момент числа путаются.

У вас есть предложения?

спасибо.

EDIT

я сделал следующее, но я получаю сообщение об ошибке. Ошибка:

Catchable fatal error: Argument 1 passed to DOMXPath::__construct() must be an instance of DOMDocument, instance of DOMElement given in C:\Users\test\www2\test_pvgis.php on line 49 

И код:

$doc = new DOMDocument(); 
libxml_use_internal_errors(true); 
$doc->loadHTML($varResponse); 

$table = $doc->getElementsByTagName('table')->item(1); 

print_r($table); 


$xpath = new DOMXpath($table); 

$lastRow = $xpath->query("(//tr)[last()]"); 

// look for td elements inside the last row we isolated above 
// path for td elements is relative 
$cells = $xpath->query('./td',$lastRow[0]); 

// you can also store the values for later use 
foreach($cells as $key=>$cell){ 
    //we are ignoring the first key, since it holds the "Total for year" bit 

    if ($key != 0){ 
     $store[] = trim($cell->nodeValue); // trim out the leading and trailing spaces 
    } 
} 
print_r($store); 

Ошибка находится здесь: $ = новый XPath DOMXPath ($ таблица); но я должен понять, почему. Любая подсказка?

+0

Dont используйте Regex. PHP предлагает собственные реализации обработки HTML: http://stackoverflow.com/questions/3577641/how-do-you-parse-and-process-html-xml-in-php –

+0

Спасибо! Я не знал об этом. Есть ли возможность настроить таргетинг на объект, который будет загружен на определенный класс или идентификатор элемента? – Aptivus

+0

удалите скобки в запросе XPath. –

ответ

2

Редактировать

Если у вас есть несколько таблиц и первый из них является отношение один.
Вам необходимо передать пример DOMDocument на конструктор DOMXpath.
Таким образом, вы будете использовать $doc для $xpath = new DOMXpath($doc);
И когда вы query для последней строки, вы передаете в качестве второго параметра в $table элемент


Вот пример использования DOMDocument и DOMXpath

// start edit 
$doc = new DOMDocument(); 
libxml_use_internal_errors(true); 
$doc->loadHTML($varResponse); 

$table = $doc->getElementsByTagName('table')->item(1); 

print_r($table); 

$xpath = new DOMXpath($doc); 

$lastRow = $xpath->query("(./tr)[last()]",$table); 
// end edit 

// look for td elements inside the last row we isolated above 
// path for td elements is relative 
$cells = $xpath->query('./td',$lastRow->item(0)); // fixed 'Cannot use object of type DOMNodeList as array i' 

// you can also store the values for later use 
foreach($cells as $key=>$cell){ 
    //we are ignoring the first key, since it holds the "Total for year" bit 

    if ($key != 0){ 
     $store[] = trim($cell->nodeValue); // trim out the leading and trailing spaces 
    } 
} 
print_r($store); 
/* 
ouputs 
Array 
(
    [0] => 1340 
    [1] => 1810 
) 
*/ 
+0

Прохладный ... Я следил за твоим примером и редактировал мой вопрос. Кажется, у меня проблема с кодом, который я не могу найти – Aptivus

+0

Я отредактировал свой ответ, чтобы соответствовать вашему последнему обновлению вопроса –

+0

Я не понимаю ... Я до сих пор получаю эту ошибку: Неустранимая ошибка: нельзя использовать объект типа DOMNodeList как массив в C: \ Users \ test \ www2 \ test_pvgis.php в строке 54 – Aptivus

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