我用 php 编写了一个脚本来抓取位于网页右上角的产品的 title
。 title
显示为 Gucci
。
当我执行下面的脚本时,它给了我一个错误 Notice: Trying to get property 'plaintext' of non-object in C:\xampp\htdocs\runcode\testfile.php on line 16
.
我怎样才能从那个网页上只得到名称 Gucci
?
到目前为止我已经写了:
<?php
include "simple_html_dom.php";
$link = "https://www.farfetch.com//bd/shopping/men/gucci-rhyton-web-print-leather-sneaker-item-12964878.aspx";
function get_content($url)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('User-Agent: Mozilla/5.0',));
curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$htmlContent = curl_exec($ch);
curl_close($ch);
$dom = new simple_html_dom();
$dom->load($htmlContent);
$itemTitle = $dom->find('#bannerComponents-Container [itemprop="name"]', 0)->plaintext;
echo "{$itemTitle}";
}
get_content($link);
?>
顺便说一句,我在脚本中使用的选择器是完美的。
为了消除混淆,我从页面源 复制了一大块 html 元素,这些元素既不是动态生成的,也不是 javascript 加密的,所以我找不到任何理由curl 无法处理:
<div class="cdb2b6" id="bannerComponents-Container">
<p class="_41db0e _527bd9 eda00d" data-tstid="merchandiseTag">New Season</p>
<div class="_1c3e57">
<h1 class="_61cb2e" itemProp="brand" itemscope="" itemType="http://schema.org/Brand">
<a href="/bd/shopping/men/gucci/items.aspx" class="fd9e8e e484bf _4a941d f140b0" data-trk="pp_infobrd" data-tstid="cardInfo-title" itemProp="url" aria-label="Gucci">
<span itemProp="name">Gucci</span>
</a>
</h1>
</div>
</div>
后记:非常可悲的是,我不得不展示另一种语言的真实示例,以确保名称 Gucci
不是动态生成的,因为评论和答案很少已经表明
以下脚本是用 python 编写的(使用无法处理动态内容的 requests
模块):
import requests
from bs4 import BeautifulSoup
url = "https://www.farfetch.com//bd/shopping/men/gucci-rhyton-web-print-leather-sneaker-item-12964878.aspx"
with requests.Session() as s:
s.headers["User-Agent"] = "Mozilla/5.0"
res = s.get(url)
soup = BeautifulSoup(res.text,"lxml")
item = soup.select_one('#bannerComponents-Container [itemprop="name"]').text
print(item)
它产生的输出:
Gucci
现在,很明显我要查找的内容是静态的。
请查看下图以识别我已经用铅笔标记的标题
。
最佳答案
@t.m.adam 已经解决了这个问题,我只想补充一点,今天没有充分的理由使用 simple_html_dom,似乎没有维护,开发在 2014 年停止,有很多 Unresolved 错误报告,最重要的是,DOMDocument 和 DOMXPath 可以做关于 simple_html_dom 可以和维护的所有内容,并且是 PHP 的集成部分,这意味着您的脚本无需包含/捆绑任何内容。用 DOMDocument 和 DOMXPath 解析它看起来像:
$htmlContent = curl_exec($ch);
curl_close($ch);
fclose($cookieFileh); // thanks to tmpfile(), this also deletes the cookie file.
$dom = @DOMDocument::loadHTML($htmlContent);
$xp=new DOMXPath($dom);
$itemTitle = $xp->query('//*[@id="bannerComponents-Container"]//*[@itemprop="name"]')->item(0)->textContent;
echo $itemTitle;
关于php - 无法从网页获取产品名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52406719/