【发布时间】:2018-10-06 18:33:31
【问题描述】:
我用 php 编写了一个脚本来从一个 title网页。当我执行以下脚本时,出现以下错误:
注意:尝试在第 16 行获取 C:\xampp\htdocs\runcode\testfile.php 中非对象的属性“nodeValue”。
我尝试过的脚本:
<?php
function get_content($url){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_exec($ch);
$htmlContent = curl_exec($ch);
curl_close($ch);
return $htmlContent;
}
$link = "https://www.purplle.com/search?q=hair%20fall%20shamboo";
$xml = get_content($link);
$dom = @DOMDocument::loadHTML($xml);
$xpath = new DOMXPath($dom);
$title = $xpath->query('//h1[@class="br-hdng"]/span')->item(0)->nodeValue;
echo "{$title}";
?>
我的预期输出是:
hair fall shamboo
虽然我在上述脚本中使用的xpath 似乎是正确的,但我在此处粘贴了可以找到title 的html 元素的相关部分:
<h1 _ngcontent-c0="" class="br-hdng"><span _ngcontent-c0="" class="pr dib">hair fall shamboo<!----></span></h1>
PostScript: 我希望解析的title 被动态加载。由于我是 php 新手,我不明白我尝试的方式是否准确。如果不是那我该怎么办?
以下是我使用两种不同语言创建的脚本,发现它们的工作原理很神奇。
我使用javascript获得了成功:
const puppeteer = require('puppeteer');
function run () {
return new Promise(async (resolve, reject) => {
try {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto("https://www.purplle.com/search?q=hair%20fall%20shamboo");
let urls = await page.evaluate(() => {
let items = document.querySelector('h1.br-hdng span');
return items.innerText;;
})
browser.close();
return resolve(urls);
} catch (e) {
return reject(e);
}
})
}
run().then(console.log).catch(console.error);
再次,我使用python 获得了成功:
import requests_html
with requests_html.HTMLSession() as session:
r = session.get('https://www.purplle.com/search?q=hair%20fall%20shamboo')
r.html.render()
item = r.html.find("h1.br-hdng span",first=True).text
print(item)
那php 怎么了?
【问题讨论】:
-
$xml = get_content($link);也许你想在这里使用file_get_contents()? -
您建议的更改带来了同样的错误@user9741470。
-
如果内容不在 HTML 中,则无法通过解析 HTML 获取。
-
@Topto 你知道问题是什么:动态内容。
CURL不运行 Js,但你可以尝试php-phantomjs,但我不推荐它,因为我从未使用过它。 PHP 是一种很棒的服务器端语言,但不擅长网络抓取。如果您打算将其用于网络抓取,我认为您应该坚持使用 Python、Ruby 等通用语言。 -
@karanthakkar 好吧,从技术上讲,这仍然是动态内容,但可能是由后端脚本而不是 JavaScript 创建的。我认为 OP 对这个特定元素不感兴趣,他们只是想学习如何使用 PHP 抓取动态内容。如果是这种情况,
php-phantomjs图书馆应该这样做,但我没有这方面的经验,所以我不会发布答案。
标签: php curl web-scraping domdocument