#laravel #laravel-5.7 #goutte #domcrawler
#laravel #laravel-5.7 #goutte #domcrawler
Вопрос:
Я установил Goutte в своем приложении Laravel 5.7 и пытаюсь извлечь значения для COAL, GAS, HYDRO и WING (столбец TNG) с этой страницы:
http://ets.aeso.ca/ets_web/ip/Market/Reports/CSDReportServlet
Route::get('hdtuto', function () {
$crawler = Goutte::request('GET', 'http://ets.aeso.ca/ets_web/ip/Market/Reports/CSDReportServlet');
$aeso_data = $crawler->filter('TABLE > TR > TD');
dd($aeso_data);
});
Я надеялся, что смогу выполнить обход узла с помощью этой опции:
$crawler->filter('body > p')->eq(0);
Согласно этому руководству:
https://symfony.com/doc/current/components/dom_crawler.html?any#node-traversing
Чтобы я мог в конечном итоге сделать что-то вроде этого:
$coal = $crawler->filter('TABLE > TR > TD')->eq(15);
$gas = $crawler->filter('TABLE > TR > TD')->eq(20);
$hydro = $crawler->filter('TABLE > TR > TD')->eq(25);
$wind = $crawler->filter('TABLE > TR > TD')->eq(30);
Вот пример того, что я сейчас получаю:
Crawler {#471 ▼
#uri: "http://ets.aeso.ca/ets_web/ip/Market/Reports/CSDReportServlet"
-defaultNamespacePrefix: "default"
-namespaces: []
-baseHref: "http://ets.aeso.ca/ets_web/ip/Market/Reports/CSDReportServlet"
-document: DOMDocument {#407 ▶}
-nodes: array:598 [▼
0 => DOMElement {#469 ▼
nodeName: "td"
nodeValue: DOMImplementation {#430 ▶}
nodeType: DOMDocumentType {#443 …}
parentNode: DOMElement {#422}
childNodes: DOMNodeList {#441 …1}
firstChild: DOMElement {#442}
lastChild: DOMElement {#442}
previousSibling: DOMNodeList {#432 ▶}
nextSibling: DOMText {#451}
attributes: DOMNamedNodeMap {#452 …1}
ownerDocument: DOMDocument {#407 ▶}
namespaceURI: null
prefix: ""
localName: "td"
baseURI: null
textContent: ""
tagName: "td"
schemaTypeInfo: null
}
1 => DOMElement {#468 ▼
nodeName: "td"
nodeValue: ""
nodeType: XML_ELEMENT_NODE
parentNode: DOMElement {#1070}
childNodes: DOMNodeList {#1071 …1}
firstChild: DOMText {#1073}
lastChild: DOMText {#1073}
previousSibling: null
nextSibling: null
attributes: DOMNamedNodeMap {#1077 …1}
ownerDocument: DOMDocument {#407 ▶}
namespaceURI: null
prefix: ""
localName: "td"
baseURI: null
textContent: ""
tagName: "td"
schemaTypeInfo: null
Комментарии:
1. И почему не работает обход узла?
2. Потому что я не думаю, что у меня правильно настроен фильтр.
Ответ №1:
В итоге я использовал это:
Route::get('scrapertest', function() {
$crawler = Goutte::request('GET', 'http://ets.aeso.ca/ets_web/ip/Market/Reports/CSDReportServlet');
$crawler2 = Goutte::request('GET', 'http://ets.aeso.ca/ets_web/ip/Market/Reports/DailyAveragePoolPriceReportServlet');
$values = $crawler->filter('tr > td')->each(function ($node) {
return $node->text();
});
// dd($values);
$values2 = $crawler2->filter('tr > td')->each(function ($node) {
return $node->text();
});
// dd($values2);
$total = $values[11];
$internal_load = $values[15];
$net_to_grid = $values[17];
$coal = $values[36];
$gas = $values[40];
$hydro = $values[44];
$wind = $values[52];
echo 'Scraper test <br>';
echo 'Alberta Total Net Generation '.$total.'<br>';
echo 'Alberta Internal Load '.$internal_load.'<br>';
echo 'Net-To-Grid Generation '.$net_to_grid.'<br>';
echo 'Coal '.$coal.'<br>';
echo 'Gas '.$gas.'<br>';
echo 'Hydro '.$hydro.'<br>';
echo 'Wind '.$wind.'<br>';
});