0

プロジェクト用のカスタムスクレーパーを構築しています。現在、Web ページ上のすべてのリンクをスクレイピングし、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 を使用して画像を選択しようとしている方法であることを知っています。私は一日中グーグルでさまざまな提案を試みましたが、何もうまくいかないようです。これは可能ですか?

ここに記載されている指示に従いました。

いくつかの進歩があります。アンカー要素内の画像の HTML をエコーできます (単に の場合echo DOMinnerHTML($link)) が、それでも alt 属性を取得できません。getAttribute()「非オブジェクトのメンバー関数への呼び出し」を取得し続けます。

ここに私のコードがあります:

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;
        }
4

1 に答える 1

1

まあ、私はあなたがこのようなものが欲しいと思うことができます:

<?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()は属性の値を返すか、指定された名前の属性が見つからない場合は空の文字列を返します。したがって、ノード属性が存在するかどうかを確認するには、戻り値が空の文字列かどうかを確認するだけです。

于 2015-06-15T17:23:48.897 に答える