以下代码从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§ion=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:
但它没有显示任何选项。
我的问题是,有没有办法检查页面是否存在,如果没有,请从维基百科中获取可能的选项列表,然后选择要显示的第一页?
答案 0 :(得分:0)
早在80年代,当提到解析XML和HTML文档时,Nancy Reagan喊道:
只对REGEX说“
等一下!我可能弄错了。我想她可能会说:“对毒品说不!”当她这么说时,我认为她可能不会考虑XML或HTML文档。但如果她是,我相信她会同意我的说法,解析XML和HTML最好用PHP的DomDocument类完成,原因有两个:
我去了“普通话”页面,发现了以下内容:
<h2>
<span class="editsection">[<a href="/w/index.php?title=Mandarin&action=edit&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的字符串。