【发布时间】:2019-02-23 16:17:55
【问题描述】:
我用 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 不是动态生成的,因为很少有 cmets 并且答案已经表明
以下脚本是用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
现在,很明显我要查找的内容是静态的。
请查看下图以识别我已经用铅笔标记的title。
【问题讨论】:
-
$itemTitle = $dom->find('#bannerComponents-Container [itemprop="name"]', 0);是否返回一个对象? -
输入 HTML 的结构是什么?请将其包含在问题中。
-
试试
[itemProp=name](由于某种原因大写P) -
请查看编辑。为了清晰起见,我添加了一些材料。
标签: php curl web-scraping simple-html-dom