0

重複の可能性:
PHPでHTMLを解析および処理する方法は?

こんにちは、私はWebページをスクレイプしました

  <div class="col blue">
        <img  src="/en/media/Dentalscreenresized.jpg" />
        <h4>This is line i want to scrape</h4>
        <p class="date">12 Sep
            <span class="year">2012</span></p>
        <p>13 people were diagnosed with oral cancer after last year&rsquo;s Mouth Cancer Awareness Day. Ring 021-4901169 to arrange for a free screening on the 19th September.</p>
        <p class="readmore"><a href="/en/news/abcd.html">Read More</a></p>
        <p class="rightreadmore"><a href="http://www.xyz.ie/en/news/">See all News&nbsp;&nbsp;&nbsp;</a></p>
    </div>

<h4>今、私はのタグを表示したいと思います。私はclass="col blue"使用するためにオンラインで見ましたpreg_match_all()私は正規表現に精通していません...助けてください

4

4 に答える 4

1

HTML の解析に正規表現を使用しないでください。ライブラリと専用ソリューションを使用するのは難しいように思えるかもしれません。「正規表現を使用しないでください」という回答がたくさんあります。

使いやすい SimpleHTMLDOMをお勧めします

    <?php
// include necessary classes first.
// e.g. include('simple_html_dom.php'); // assuming the file is in same folder as the php file. Or include it at first or you will get a fatal error.
    $html = str_get_html('<div class="col blue">
            <img  src="/en/media/Dentalscreenresized.jpg" />
            <h4>This is line i want to scrape</h4>
            <p class="date">12 Sep
                <span class="year">2012</span></p>
            <p>13 people were diagnosed with oral cancer after last year&rsquo;s Mouth Cancer Awareness Day. Ring 021-4901169 to arrange for a free screening on the 19th September.</p>
            <p class="readmore"><a href="/en/news/abcd.html">Read More</a></p>
            <p class="rightreadmore"><a href="http://www.xyz.ie/en/news/">See all News&nbsp;&nbsp;&nbsp;</a></p>
        </div>
    ');
    
    $h4 = $html->find('h4.col.blue');
    ?>

$h4 には、col および blue クラスを持つ h4 タグを持つすべての要素が含まれます。

于 2012-09-13T09:54:42.317 に答える
1

よくあることですが、ここには 2 つのオプションがあります (スクレイピングされたページのコンテンツは$content変数に格納されていると想定しています)。

の方法(クトゥルフ)正規表現:

$matches = array();
preg_match_all('#<div class="col blue">.+?<h4>([^<]+)#is', $content, $matches);
var_dump($matches[1]);

DOM 解析の方法:

$dom = new DOMDocument();
$dom->loadHTML($content);
$xpath = new DOMXpath($dom);
$elements = $xpath->query('//div[@class="col blue"]/h4');
foreach ($elements as $el) {
   var_dump($el->textContent);
}

もちろん、本当の問題は、どの方法を選択するかです。

最初のオプションは短く、簡潔で、全体的に非常に魅力的です。私はそれを1回、2回、または(pony he comes)さらに使用することを認めます-使用するHTMLが常に正規化され、予測不可能な方法で突然変化する構造に対処できることがわかっている場合にのみ。

2 番目のオプションは少し大きく、一般的すぎるように見えるかもしれません。それでも、私の意見では、ソースの変更に対してはるかに柔軟で回復力があります。

たとえば、ソース HTML の一部の「青色」の div が<h4>要素なしで出てきた場合にどうなるかを考えてみてください。このような状況で正しく機能するには、正規表現をより洗練されたものにする必要があります。そして、XPath クエリは? 変わらない - 少しでも。

于 2012-09-13T10:11:26.330 に答える
0

HTML から情報を解析/スクレイピングするために正規表現を使用しないでください。PHP に組み込まれているような DOM パーサーを試してください。

于 2012-09-13T09:53:29.753 に答える
0

DOM と Xpath を使用します。html データを $html に入れます。

$dom = new DOMDocument('1.0', 'UTF-8');
@$dom->loadHTML($html);
$xmlElements = simplexml_import_dom($dom);

$divs = $xmlElements->xpath("//div[@class='col blue']");
foreach($divs as $div)
{
  $heading = $div->h4;
  var_dump($heading);
}

追記:

Don't use regular expressions to parse/scrape info from HTML. Its a Bad technique
于 2012-09-13T10:11:56.350 に答える