6

ページの HTML ソースを取得する次のコードがあります。

$page = file_get_contents('http://example.com/page.html');
$page = htmlentities($page);

私はそこからいくつかのコンテンツをスクレイピングしたい。たとえば、ページのソースに次の内容が含まれているとします。

<strong>technorati.com</strong><br />
Connection failed<br /><br />Pinging <strong>icerocket.com</strong><br />
Connection failed<br /><br />Pinging <strong>weblogs.com</strong><br />
Done<br /><br />Pinging <strong>newsgator.com</strong><br />
Done<br /><br />Pinging <strong>blo.gs</strong><br />
Done<br /><br />Pinging <strong>feedburner.com</strong><br />
Done<br /><br />Pinging <strong>blogstreet.com</strong><br />
Done<br /><br />Pinging <strong>my.yahoo.com</strong><br />
Connection failed<br /><br />Pinging <strong>moreover.com</strong><br />
Connection failed<br /><br />Pinging <strong>newsisfree.com</strong><br />
Done<br />

これをソースからスクレイピングして変数に格納する方法はありますか?次のようになります。

technorati.com接続に失敗しました
icerocket.com接続に失敗しました
eblogs.com完了Ect
.

ページが動的であるため、問題が発生しています。ソース内の各サイトを検索できますか? しかし、その後の結果をどのように得るのでしょうか? (接続失敗/完了)
助けてくれてありがとう!

4

3 に答える 3

15

ここで入手できる単純な HTML DOM PHP ライブラリを使用して、複数のサイトをスクレイピングしてみました: http://simplehtmldom.sourceforge.net/

次に、次のようなコードを使用します。

<?php
include_once 'simple_html_dom.php';

$url = "http://slashdot.org/";
$html = file_get_html($url);

//remove additional spaces
$pat[0] = "/^\s+/";
$pat[1] = "/\s{2,}/";
$pat[2] = "/\s+\$/";
$rep[0] = "";
$rep[1] = " ";
$rep[2] = "";

foreach($html->find('h2') as $heading) { //for each heading
        //find all spans with a inside then echo the found text out
        echo preg_replace($pat, $rep, $heading->find('span a', 0)->plaintext) . "\n"; 
}
?>

これにより、次のような結果になります。

5.8 Earthquake Hits East Coast of the US
Origins of Lager Found In Argentina
Inside Oregon State University's Open Source Lab
WebAPI: Mozilla Proposes Open App Interface For Smartphones
Using Tablets Becoming Popular Bathroom Activity
The Syrian Government's Internet Strategy
Deus Ex: Human Revolution Released
Taken Over By Aliens? Google Has It Covered
The GIMP Now Has a Working Single-Window Mode
Zombie Cookies Just Won't Die
Motorola's Most Important 18 Patents
MK-1 Robotic Arm Capable of Near-Human Dexterity, Dancing
Evangelical Scientists Debate Creation Story
Android On HP TouchPad
Google Street View Gets Israeli Government's Nod
Internet Restored In Tripoli As Rebels Take Control
GA Tech: Internet's Mid-Layers Vulnerable To Attack
Serious Crypto Bug Found In PHP 5.3.7
Twitter To Meet With UK Government About Riots
EU Central Court Could Validate Software Patents
于 2011-09-06T14:27:20.677 に答える
0

これは最善の解決策ではありませんが、機能します:

$page = file_get_contents('http://example.com/page.html');
preg_match_all('#<strong>([^<]+)</strong><br />\s*([^<]+)<#', $page, 
                                             $result, PREG_SET_ORDER);
foreach ($result as $row) {
    echo "<p><b>$row[1]</b> $row[2]</p>\n";
}

より複雑なものをエスケープする必要がある場合は、DOMDocumentを検討してください。

于 2011-09-06T14:30:32.687 に答える
-3

正規表現を使用できます。

編集

正規表現は大規模な問題には最適なソリューションではありませんが、標準形式の単純なページの場合、多くの場合、正規表現が最も簡単に使用できます。

于 2011-09-06T14:27:09.973 に答える