php - 获取嵌套元素 PHP HTML Simple Dom
问题描述
我想要来自外部网站的评论项目。我无法编辑网站。
该网站看起来像这样,我编辑了很多东西,但这是来自正文的路径:
<body>
<div class="js-standby-status tn-relative">
<div class="tn-container serp-mobile-container">
<div class="tn-row tn-row-sm-spacing search-page">
<section class="span-d-9 section-main-content-SERP">
<div id="js-products">
<section class="js-results-wrapper">
<section>
<ul class="product-list main-product-list-wrapper">
<li class="product-list-item product-list-item-first standby-status">
<article>
<div class="sl-search-result mobile-search-result">
<a class="sl-search-result-link" href="$url"></a>
<!-- Link is needed -->
<div class="search-result-body">
<a class="top-item-title_wrapper">
<h2 class="search-result-name">
Dunlop Winter Sport 5
</h2>
<span itemprop="mpn">
5452000470454
</span>
</a>
<div class="tn-row">
<div class="span-d-6">
<div class="product-description">
<ul class="search-result-desc-list">
<li class="search-result-desc-list-item" title="205/55 R16 91H">
205/55 R16 91H
</li>
</ul>
</div>
</div>
</div>
</div>
</div>
</article>
</li>
</ul>
</section>
</section>
</div>
</section>
</div>
</div>
</div>
</body>
</html>
我正在使用 PHP HTML Simple Dom 和 PHP 7.3。
我目前正在使用此代码从网站获取信息:
$html = file_get_html($url);
if(!empty($html)){
$content_url = $html->find(".product-list-item", 0)->find('.sl-search-result', 0)->find('.sl-search-result-link', 0)->getAttribute('href', 0);
$content_naam = $html->find(".product-list-item", 0)->find('.sl-search-result', 0)->find('.sl-search-result-link')->find('.search-result-body', 0)->find('.top-item-title_wrapper', 0)->find('.search-result-name', 0)->plaintext;
$content_ean = $html->find(".product-list-item", 0)->find('.sl-search-result', 0)->find('.sl-search-result-link')->find('.search-result-body', 0)->find('.top-item-title_wrapper', 0)->find("span[itemprop='mpn")->plaintext;
$content_maat = $html->find(".product-list-item", 0)->find('.sl-search-result', 0)->find('.sl-search-result-link')->find('.search-result-body', 0)->find('.tn-row', 0)->find('span-d-6', 0)->find('.product-description')->find('.search-result-desc-list')->find('.search-result-desc-list-item')->plaintext;
if(!empty($content_url)){
if(!empty($content_naam)){
if(!empty($content_ean)){
if(!empty($content_maat)){
echo $item . ". <a href='" . $content_url . "'>EAN: " . $content_ean . " Product naam: " . $content_naam ."</a><br/>";
}else{
echo "Content maat is empty.";
}
}else{
echo "Content ean is empty";
}
}else{
echo "Content naam is empty";
}
}else{
echo "Content URL is empty";
}
}else{
echo "No HTML found!";
}
}
我在脚本中收到错误,不是在网站上,而是在我的 apache2 服务器的日志中。见下文:
Uncaught Error: Call to a member function find() on null in /var/www/html/scraper/bandenNL.php:30\nStack trace:\n#0 {main}\n thrown in /var/www/html/scraper/bandenNL.php on line 30
您想了解更多信息,请发表评论。
解决方案
如果我对您的理解正确,那么这些方面的内容应该可以让您与您正在寻找的内容足够接近:
include('simple_html_dom.php');
$htmlDoc = new DOMDocument();
$htmlDoc->loadXML($html);
$xpath = new DOMXpath($htmlDoc);
$link = $xpath->query("//a[@href]/@href");
$name = $xpath->query('//h2[@class="search-result-name"]/text()');
$mpn = $xpath->query('//span[@itemprop="mpn"]/text()');
$title_attr = $xpath->query('//li[@class="search-result-desc-list-item"]/@title');
$title = $xpath->query('//li[@class="search-result-desc-list-item"]/text()');
echo "Link: ". $link[0]->textContent . "<br>";
echo "Name: ". $name[0]->textContent . "<br>";
echo "MPN: ". $mpn[0]->textContent . "<br>";
echo "Title attribure: ". $title_attr[0]->textContent . "<br>";
echo "Title: ". $title[0]->textContent . "<br>";
输出:
Link: my.url
Name: Dunlop Winter Sport 5
MPN: 5452000470454
Title attribure: 205/55 R16 91H
Title: 205/55 R16 91H
推荐阅读
- python - 我的 csv 文件中的文本被读取为原始字符串。它包含“it\'s”而不是它。我该如何清洁这个?
- django - Django:在模型级别而不是列级别应用验证器
- cypress - 赛普拉斯测试通过了单个表单输入字段,但忽略了以下输入字段
- python - 从嵌入列中的列表中提取元素
- python - 我的 python 气泵代码有什么问题?
- ios - 如何在 Swift 中向自定义 DateComponent 添加分钟
- python - 将列表中的唯一元素附加到新列表
- wordpress - AMP 上的 Google 表单是否需要 HTTPS?
- extreact - Sencha extJs/exreact 6/7 Tree 获取选中记录
- python - 排序算法不会产生正确的输出