网页抓取链接需要判断是否包含img元素
Scraping Links on Webpage Need to Determine if they contain Img elements
我正在为项目构建自定义抓取工具。我目前可以抓取网页上的所有链接,将 HREF 和锚文本存储在数据库中。但是,在尝试确定锚元素是否包含图像元素时,我遇到了困难。
这是我的代码:
foreach($rows as $row) {
$url = $row['url'];
$dom = new DOMDocument;
libxml_use_internal_errors(TRUE); //disable libxml errors
$dom->loadHTML(file_get_contents($url));
// Write source page, destination URL and anchor text to the database
foreach($dom->getElementsByTagName('a') as $link) {
$href = $link->getAttribute('href');
$anchor = $link->nodeValue;
$img = $link->getElementsByTagName('img');
$imgalt = $img->getAttribute('alt');
然后我将数据写入数据库。这在 $img 和 $imgalt 中工作正常,但我真的想确定锚点是否包含图像以及是否有 alt 属性。我知道问题在于我如何尝试使用 getElementsByTagName select 图像。我整天都在谷歌搜索并尝试了很多不同的建议,但似乎没有任何效果。这可能吗?
我已按照 here 中提到的说明进行操作。
有一些进展。我可以在锚元素中回显图像的 HTML(如果我只是 echo
DOMinnerHTML($link)
),但我仍然无法获得 alt 属性。我不断收到 "Call to a member function getAttribute()
on a non-object".
这是我的代码:
foreach($dom->getElementsByTagName('a') as $link) {
$href = $link->getAttribute('href');
$anchor = $link->nodeValue;
$imgdom = DOMinnerHTML($link);
$imgalt = $imgdom->getAttribute('alt');
if(isset($imgalt)){
echo $imgalt;
}
嗯,我可以假设你想要这样的东西:
<?php
$html_fragment = <<<HTML
<html>
<head>
<title></title>
</head>
<body>
<div id="container">
<a href="#a">there is n image here</a>
<a href="#b"><img src="path/to/image-b" alt="b: alt content"></a>
<a href="#c"><img src="path-to-image-c"></a>
<a href="#d"><img src="path-to-image-d" alt="c: alt content"></a>
</div>
</body>
</html>
HTML;
$dom = new DOMDocument();
@$dom->loadHTML($html_fragment);
$links = $dom->getElementsByTagName('a');
foreach ($links as $link) {
# link contains image child?
$imgs = $link->getElementsByTagName('img');
$has_img = $imgs->length > 0;
if ($has_img) {
$has_alt = (bool) $imgs->item(0)->getAttribute("alt");
# img element has alt attribute?
if ($has_alt) {
// do something...
}
} else {
// do something...
}
}
请记住,如 PHP 文档中所述,DOMElement::getAttribute() return 属性的值,或 空字符串 如果没有找到具有给定名称的属性。因此,为了检查节点属性是否存在,只需检查 return 值是否为空字符串。
我正在为项目构建自定义抓取工具。我目前可以抓取网页上的所有链接,将 HREF 和锚文本存储在数据库中。但是,在尝试确定锚元素是否包含图像元素时,我遇到了困难。
这是我的代码:
foreach($rows as $row) {
$url = $row['url'];
$dom = new DOMDocument;
libxml_use_internal_errors(TRUE); //disable libxml errors
$dom->loadHTML(file_get_contents($url));
// Write source page, destination URL and anchor text to the database
foreach($dom->getElementsByTagName('a') as $link) {
$href = $link->getAttribute('href');
$anchor = $link->nodeValue;
$img = $link->getElementsByTagName('img');
$imgalt = $img->getAttribute('alt');
然后我将数据写入数据库。这在 $img 和 $imgalt 中工作正常,但我真的想确定锚点是否包含图像以及是否有 alt 属性。我知道问题在于我如何尝试使用 getElementsByTagName select 图像。我整天都在谷歌搜索并尝试了很多不同的建议,但似乎没有任何效果。这可能吗?
我已按照 here 中提到的说明进行操作。
有一些进展。我可以在锚元素中回显图像的 HTML(如果我只是 echo
DOMinnerHTML($link)
),但我仍然无法获得 alt 属性。我不断收到 "Call to a member function getAttribute()
on a non-object".
这是我的代码:
foreach($dom->getElementsByTagName('a') as $link) {
$href = $link->getAttribute('href');
$anchor = $link->nodeValue;
$imgdom = DOMinnerHTML($link);
$imgalt = $imgdom->getAttribute('alt');
if(isset($imgalt)){
echo $imgalt;
}
嗯,我可以假设你想要这样的东西:
<?php
$html_fragment = <<<HTML
<html>
<head>
<title></title>
</head>
<body>
<div id="container">
<a href="#a">there is n image here</a>
<a href="#b"><img src="path/to/image-b" alt="b: alt content"></a>
<a href="#c"><img src="path-to-image-c"></a>
<a href="#d"><img src="path-to-image-d" alt="c: alt content"></a>
</div>
</body>
</html>
HTML;
$dom = new DOMDocument();
@$dom->loadHTML($html_fragment);
$links = $dom->getElementsByTagName('a');
foreach ($links as $link) {
# link contains image child?
$imgs = $link->getElementsByTagName('img');
$has_img = $imgs->length > 0;
if ($has_img) {
$has_alt = (bool) $imgs->item(0)->getAttribute("alt");
# img element has alt attribute?
if ($has_alt) {
// do something...
}
} else {
// do something...
}
}
请记住,如 PHP 文档中所述,DOMElement::getAttribute() return 属性的值,或 空字符串 如果没有找到具有给定名称的属性。因此,为了检查节点属性是否存在,只需检查 return 值是否为空字符串。