PHP5.3でパーサーを作る勉強をしています。


http://ja.wikipedia.org/wiki/東京太・ゆめ子

最初の文書
”東京太・ゆめ子(あずまきょうた・ゆめこ)は漫才協会、落語芸術協会所属の夫婦漫才コンビ。1976年結婚、1993年結成。2010年、文化庁芸術祭大衆芸能部門で大賞受賞。出囃子は「東京ブギウギ」。”

別の例
http://ja.wikipedia.org/wiki/カナリア_(お笑い)

最初の文書
”カナリアは、吉本興業東京本社(東京吉本、厳密には子会社のよしもとクリエイティブ・エージェンシー)所属のお笑いコンビ。メンバー共に大阪NSC21期生(東京NSC4期生扱い)。2003年結成。。”

の最初の文書(""で囲んだ部分) の部分を表示するプログラムを書いていただけると助かります。
文中のリンク・書体はそのまま活かしてください。

よろしくお願いします。

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2012/10/12 21:43:06
  • 終了:2012/10/19 21:45:03

ベストアンサー

id:Cherenkov No.2

Cherenkov回答回数1503ベストアンサー獲得回数4932012/10/13 00:19:02

ポイント67pt

目的は概要の抽出。概要の条件は、
#mw-content-text > p かつ #mw-content-text > table[0] よりも前にある要素とする。
simple_html_dom.phpを使って作ってみました。utf-8で保存。

<?php
function pr($var) {
	echo '<pre>'; print_r($var); echo '</pre>';
}

header('Content-Type:text/html; charset=UTF-8');
require_once("simple_html_dom.php");

function getWikiSummary($keyword) {
	$result = '';
	$url = 'http://ja.wikipedia.org/wiki/' . urlencode($keyword);
	$url = preg_replace('/%28/u', '(', $url); //括弧はこの処理をしないとダメみたい。
	$url = preg_replace('/%29/u', ')', $url);
	$html = file_get_html($url);
	$ps  = $html->find('#mw-content-text > p');
	for ($i = 0, $n = count($ps); $i < $n; $i++) {
		$result .= $ps[$i]->innertext;
		if ($ps[$i]->nextSibling()->tag === 'table') {
			break;
		}
	}
	$html->clear();
	return $result;
}

$keywords = array('東京太・ゆめ子', 'カナリア_(お笑い)');

echo '<dl>';
foreach ($keywords as $keyword) {
	$summary = getWikiSummary($keyword);
	echo '<dt>' . $keyword . '</dt>';	
	echo '<dd>' . $summary . '</dd>';
}
echo '</dl>';
他3件のコメントを見る
id:Cherenkov

例外が見つかったらそれを概要の条件に加えてるかしてみてください。

2012/10/13 00:54:47
id:kohhi

いつもありがとうございます。いろいろなパターンが出てきそうです。
また、よろしくお願いします。
お礼が遅くなってすいません。

2012/10/19 21:57:09

その他の回答(2件)

id:oil999 No.1

oil999回答回数1728ベストアンサー獲得回数3202012/10/12 22:51:14

ポイント67pt

パーサーというよりスクレイピングだと思います。
以下のスクリプトではどうでしょう
$url に解析したいWikiのURLを入力してください。

<?php
mb_internal_encoding('UTF-8');
mb_regex_encoding('UTF-8');
ini_set('user_agent', 'User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)');

$url = 'http://ja.wikipedia.org/wiki/%E6%9D%B1%E4%BA%AC%E5%A4%AA%E3%83%BB%E3%82%86%E3%82%81%E5%AD%90';

$pat = "/(<p>.*<\/p>)\n<table id=\"toc\" class=\"toc\">/msiu";

$buf = file_get_contents($url);
preg_match($pat, $buf, $arr);

echo <<< EOD
<html>
<head>
<meta charset="utf-8">
<body>
$arr[1];
</body>
</html>

EOD;
?>
id:kohhi

お返事ありがとうございました。
いつもありがとうございます。
また、よろしくお願いします。
お礼が遅くなってすいません。

2012/10/19 21:55:58
id:Cherenkov No.2

Cherenkov回答回数1503ベストアンサー獲得回数4932012/10/13 00:19:02ここでベストアンサー

ポイント67pt

目的は概要の抽出。概要の条件は、
#mw-content-text > p かつ #mw-content-text > table[0] よりも前にある要素とする。
simple_html_dom.phpを使って作ってみました。utf-8で保存。

<?php
function pr($var) {
	echo '<pre>'; print_r($var); echo '</pre>';
}

header('Content-Type:text/html; charset=UTF-8');
require_once("simple_html_dom.php");

function getWikiSummary($keyword) {
	$result = '';
	$url = 'http://ja.wikipedia.org/wiki/' . urlencode($keyword);
	$url = preg_replace('/%28/u', '(', $url); //括弧はこの処理をしないとダメみたい。
	$url = preg_replace('/%29/u', ')', $url);
	$html = file_get_html($url);
	$ps  = $html->find('#mw-content-text > p');
	for ($i = 0, $n = count($ps); $i < $n; $i++) {
		$result .= $ps[$i]->innertext;
		if ($ps[$i]->nextSibling()->tag === 'table') {
			break;
		}
	}
	$html->clear();
	return $result;
}

$keywords = array('東京太・ゆめ子', 'カナリア_(お笑い)');

echo '<dl>';
foreach ($keywords as $keyword) {
	$summary = getWikiSummary($keyword);
	echo '<dt>' . $keyword . '</dt>';	
	echo '<dd>' . $summary . '</dd>';
}
echo '</dl>';
他3件のコメントを見る
id:Cherenkov

例外が見つかったらそれを概要の条件に加えてるかしてみてください。

2012/10/13 00:54:47
id:kohhi

いつもありがとうございます。いろいろなパターンが出てきそうです。
また、よろしくお願いします。
お礼が遅くなってすいません。

2012/10/19 21:57:09

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません