如何从外部网站抓取内容并将其显示在我的网站上? (类似于RSS提要或其他聚合器的用途)。
例如,假设我要显示其他网站日历中的项目:
其他网站:
<h1>Here's our calendar:</h1>
<div class="calendar_item">
<h2>Boston Marathon</h2>
<p class="date">June 23, 2012</p>
<p class="description">This marathon is 26.2 miles and lots of fun.</p>
</div>
<div class="calendar_item">
<h2>Irish Pub Crawl</h2>
<p class="date">July 17, 2012</p>
<p class="description">Shamrocks and green things are super-fun.</p>
</div>
<div class="calendar_item">
<h2>Tim's Birthday</h2>
<p class="date">August 25, 2012</p>
<p class="description">It's Tim's birthday, yo.</p>
</div>
我的网站:
<h1>Here's a feed of some calendar items from someone else's website:</h1>
<div class="event_title">Boston Marathon</div>
<div class="event_date">June 23, 2012</div>
<div class="event_description">This marathon is 26.2 miles and lots of fun.</div>
<div class="event_title">Irish Pub Crawl</div>
<div class="event_date">July 17, 2012</div>
<div class="event_description">Shamrocks and green things are super-fun.</div>
<div class="event_title">Tim's Birthday</div>
<div class="event_date">August 25, 2012</div>
<div class="event_description">It's Tim's birthday, yo.</div>
这是我尝试过的(使用MAMP):
<?php
$url = "http://example.com";
$page = curl($url);
$pattern = '%
<h2>(.+?)</h2>
%i';
preg_match($pattern,$page,$matches);
print_r($matches);
?>
...打印:
Array ( )
教程/等。我看过包括像“尝试cURL”这样含糊不清的答案。这看起来很简单,但我是一个难倒的菜鸟。
先谢谢你,伙计们:)
答案 0 :(得分:3)
我不推荐使用正则表达式来解析HTML。 PHP 5+附带一个解析器,您可以使用它,如下所示。
$content = file_get_contents('test.html');
$doc =
<<<DOC
$content
DOC;
$dom = new DOMDocument();
$dom->loadHTML($doc);
$h2Tags = $dom->getElementsByTagName("h2");
$pTags = $dom->getElementsByTagName("p");
foreach($h2Tags as $h2 ) {
//do something
}
foreach($pTags as $p ) {
if($p->getAttribute("class") == "date") {
//do something
}
}
$ h2的类型为DOMElement。它继承了DOMNode。因此,您可以使用nodeValue属性来访问值。在上面的示例中,您可以编写$ h2-&gt; nodeValue来访问内容。
答案 1 :(得分:2)
您可以尝试使用此库http://simplehtmldom.sourceforge.net/
然后只是:
foreach($dom->find('p[class=date]' as $p) {
$date = $p->innertext;
}
这会给你
的内容或者你更多地使用stripos进行挖掘
foreach($dom->find('p') as $p) {
if(stripos($p->class, 'date') !== false) {
//do something
}
}
答案 2 :(得分:0)
以下是使用cURL的示例:
http://tr2.php.net/manual/en/curl.examples-basic.php
并在应用preg_match
之前检查您是否收到数据。如果你得到一些,那么这就是导致你问题的正则表达式。