JSON解析,如果维基百科有多个选项选择要显示的第一页

时间:2013-05-06 17:00:25

标签: php json parsing wikipedia

以下代码从Wikipedia页面获取第一段。

<?
// action=parse: get parsed text
// page=Baseball: from the page Baseball
// format=json: in json format
// prop=text: send the text content of the article
// section=0: top content of the page

$find = $_GET['find'];

$url = 'http://en.wikipedia.org/w/api.php?action=parse&page=baseball&format=json&prop=text&section=0';
$ch = curl_init($url);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_USERAGENT, "TestScript"); // required by wikipedia.org server; use YOUR user agent with YOUR contact information. (otherwise your IP might get blocked)
$c = curl_exec($ch);

$json = json_decode($c);

$content = $json->{'parse'}->{'text'}->{'*'}; // get the main text content of the query (it's parsed HTML)

// pattern for first match of a paragraph
$pattern = '#<p>(.*?)</p>#s'; // http://www.phpbuilder.com/board/showthread.php?t=10352690
if(preg_match_all($pattern, $content, $matches))
{
    // print $matches[0]; // content of the first paragraph (including wrapping <p> tag)
    echo "Wikipedia:<br>";
    print strip_tags(implode("\n\n",$matches[1])); // Content of the first paragraph without the HTML tags.
}
?>

问题在于,有时我想在PHP中将标题变为变量,以便我可以“搜索”信息,但我的查询并不总是合法的维基百科页面。

例如,当上述代码搜索棒球时,有一个棒球页面。但是当我搜索“普通话”时,它显示:

Mandarin may refer to any of the following:

但它没有显示任何选项。

我的问题是,有没有办法检查页面是否存在,如果没有,请从维基百科中获取可能的选项列表,然后选择要显示的第一页?

1 个答案:

答案 0 :(得分:0)

早在80年代,当提到解析XML和HTML文档时,Nancy Reagan喊道:

只对REGEX说“

等一下!我可能弄错了。我想她可能会说:“对毒品说不!”当她这么说时,我认为她可能不会考虑XML或HTML文档。但如果她是,我相信她会同意我的说法,解析XML和HTML最好用PHP的DomDocument类完成,原因有两个:

  • 正则表达式不是很可靠。一个角色可以将它们抛弃,网站管理员为渲染你的正则表达式模式所做的任何更改都是无用的。
  • 正则表达式很慢,特别是如果您必须从文档中获取多个项目。 DomDocument模型解析文档一次,然后所有数据都包含在对象中以便于访问。

我去了“普通话”页面,发现了以下内容:

<h2>
    <span class="editsection">[<a href="/w/index.php?title=Mandarin&amp;action=edit&amp;section=1" title="Edit section: Officials">edit</a>]</span>
    <span class="mw-headline" id="Officials">Officials</span>
</h2>
<ul>
    <li><a href="/wiki/Mandarin_(bureaucrat)" title="Mandarin (bureaucrat)">Mandarin (bureaucrat)</a>, a bureaucrat of Imperial China (the original meaning of the word), Vietnam, and by analogy, any senior government bureaucrat</li>
</ul>

您可以使用以下代码获取第一个链接:

$doc = new DOMDocument();
//load HTML string into document object
if ( ! @$doc->loadHTML($data)){
    return FALSE;
}
//create XPath object using the document object as the parameter
$xpath = new DOMXPath($doc);
$query = "//span[@class='editsection']/a";
//XPath queries return a NodeList
$res = $xpath->query($query);
$link = $res->item(0)->getAttribute('href');

获得URL后,请求下一页是一件简单的事情。至于测试页面是否有这些信息,我想你可以搞清楚。

如果您要做这类事情,那么了解DomDocument类和进行xpath查询是非常值得的。

修改

变量$ data只是一个包含页面HTML的字符串。