Puphpeteer语言 - 从链接中获取文本和href属性



我正在使用"@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"

最新更新