0

以下代码从 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 中的变量,以便我可以“搜索”信息,但我的查询并不总是合法的 Wikipedia 页面。

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

Mandarin may refer to any of the following:

但它没有显示任何选项。

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

4

1 回答 1

0

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

对正则表达式说不!

等一下!我可能错了。我想她可能说过,“对毒品说不!” 我不认为她说这话时可能在考虑 XML 或 HTML 文档。但如果她是的话,我相信她会同意我的观点,即使用 PHP 的 DomDocument 类更好地解析 XML 和 HTML,原因有两个:

  • 为此目的,正则表达式不是很可靠。单个字符可以将它们扔掉,并且网站管理员所做的任何更改都会使您的正则表达式模式无用。
  • 正则表达式很慢,尤其是当您必须从文档中获取多个项目时。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 的字符串。

于 2013-05-06T18:33:42.943 回答