我正在使用"@nesk/puphpeteer": "^2.0.0"
链接到Github-Repo,并希望从链接中获得文本和href
属性。
我试了如下:
<?php
require_once '../vendor/autoload.php';
use NeskPuphpeteerPuppeteer;
use NeskRialtoDataJsFunction;
$debug = true;
$puppeteer = new Puppeteer([
'read_timeout' => 100,
'debug' => $debug,
]);
$browser = $puppeteer->launch([
'headless' => !$debug,
'ignoreHTTPSErrors' => true,
]);
$page = $browser->newPage();
$page->goto('http://example.python-scraping.com/');
//get text and link
$links = $page->querySelectorXPath('//*[@id="results"]/table/tbody/tr/td/div/a', JsFunction::createWithParameters(['node'])
->body('return node.textContent;'));
// iterate over links and print each link and its text
// get single text
$singleText = $page->querySelectorXPath('//*[@id="pagination"]/a', JsFunction::createWithParameters(['node'])
->body('return node.textContent;'));
$browser->close();
当我运行上面的脚本时,我从页面中获得节点,但是我不能访问属性或文本?
有什么建议吗?
感谢您的回复!
querySelectorXPath
返回ElementHandle
的数组。还有一点querySelectorXPath
不支持回调函数
首先获取所有节点ElementHandle
$links = $page->querySelectorXPath('//*[@id="results"]/table/tbody/tr/td/div/a');
然后遍历链接以访问节点
的属性或文本foreach($links as $link){
// for text
$text = $link->evaluate(JsFunction::createWithParameters(['node'])
->body('return node.innerText;'));
// for link
$link = $link->evaluate(JsFunction::createWithParameters(['node'])
->body('return node.href;'));
}
免责声明:这只是一个中间答案-一旦我有更具体的HTML属性请求或其他期望被检索时,我会更新。
tl;博士提到的编写器包nesk/puphpeteer
实际上只是一个基于NodeJS的puppeteer
底层实现的包装器。因此,访问数据和结构必须"相似"。
也许Codeception
(无头)或symfony/dom-crawler
(原始标记)可能是更好和更成熟的替代品。
无论如何,让我们从上面的例子中选择并一步一步地完成它:
$links = $page->querySelectorXPath(
'//*[@id="results"]/table/tbody/tr/td/div/a',
JsFunction::createWithParameters(['node'])->body('return node.textContent;')
);
- XPath查询
$x()
将产生ElementHandle
项的数组 - 访问导出的
node.textContent
(从JsFunction
),通过ElementHandle.getProperty(prop)
获取相应的数据 - 导出标量值(PHP)然后通过
ElementHandle.jsonValue()
完成
因此,之后我们将得到这样的内容:
$links = $page->querySelectorXPath(
'//*[@id="results"]/table/tbody/tr/td/div/a',
JsFunction::createWithParameters(['node'])->body('return node.textContent;')
);
/** @var NeskPuphpeteerResourcesElementHandle $link */
foreach ($links as $link) {
var_dump($link->getProperty('textContent')->jsonValue());
}
输出以下原始数据(从http://example.python-scraping.com/):
检索)string(12) " Afghanistan"
string(14) " Aland Islands"
string(8) " Albania"
string(8) " Algeria"
string(15) " American Samoa"
string(8) " Andorra"
string(7) " Angola"
string(9) " Anguilla"
string(11) " Antarctica"
string(20) " Antigua and Barbuda"