php - 无法从网页获取产品名称

标签 php curl web-scraping simple-html-dom

我用 php 编写了一个脚本来抓取位于网页右上角的产品的 titletitle 显示为 Gucci

当我执行下面的脚本时,它给了我一个错误 Notice: Trying to get property 'plaintext' of non-object in C:\xampp\htdocs\runco​​de\testfile.php on line 16.

我怎样才能从那个网页上只得到名称 Gucci

Link to the url

到目前为止我已经写了:

<?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

现在,很明显我要查找的内容是静态的。

请查看下图以识别我已经用铅笔标记的标题

enter image description here

最佳答案

@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/

相关文章:

bash - 使用 Curl 数据二进制选项,内存不足

c++ - CURLpp,段错误

c# - 使用 C# 仅下载网页的第一部分(长度未知)

python - Scrapy - 如何在 url 中勾选复选框然后抓取

php图片上传mysql数据库

php - 搜索表单 url 结构

linux - curl (58) 无法加载客户端证书 -8912

php - 邮寄后回到原来的位置

PHP Laravel - OrderBy(反向)和分页

css - 使用 rvest 抓取所选下拉项的文本