我仍然坚持试图解析维基百科文章的问题。实际上我想从维基百科解析文章的信息框部分,即我的应用程序引用了国家和每个国家页面,我希望能够显示该国家相应的维基百科文章中的信息框。我在这里使用php - 如果有人有关于我应该在这里做什么的任何代码片段或建议,我将不胜感激。
再次感谢。
修改
我有一个包含国家名称的数据库表。我有一个脚本,需要一个国家,并显示其详细信息。我想抓住信息框 - 带有所有国家详细信息图片等的蓝色框,因为它来自维基百科并在我的页面上显示。我想知道一个非常简单易行的方法 - 或者有一个脚本只是将信息框的信息下载到本地远程系统,以后我可以自己访问。我的意思是我对这里的想法持开放态度 - 除了我想要的最终结果是在我的页面上看到信息框 - 当然在底部有一些基于维基百科的内容链接:)
修改
我想我在http://infochimps.org找到了我想要的东西 - 他们在我认为的YAML语言中得到了大量的数据集。我可以直接使用这些信息,但我需要一种方法来不断更新维基百科中的这些信息,尽管我认为信息框很少会改变特别是国家,除非一些国家决定改变他们的首都城市。
答案 0 :(得分:14)
我会使用维基百科(维基媒体)API。您可以使用JSON,XML,php本机格式和其他格式获取数据。然后,您仍然需要解析返回的信息以提取和格式化您想要的信息,但信息框的开始,停止和信息类型是明确的。
运行您的查询只是rvsection = 0,因为第一部分会在第一个分节符之前获取材料,包括信息框。然后你需要解析信息框内容,这不应该太难。有关正式的维基百科api文档,请参阅en.wikipedia.org/w/api.php;有关本手册,请参阅www.mediawiki.org/wiki/API。
答案 1 :(得分:10)
我建议您使用DBPedia代替已经完成将维基百科中的数据转换为可用,可链接,开放的表单的工作。
答案 2 :(得分:2)
这取决于你想去的路线。以下是一些可能性:
不要只需点击最新版本的实时页面,并在每次应用需要该框时重做解析。这对您和维基媒体来说都是一种巨大的资源浪费。
答案 3 :(得分:2)
有许多语义数据提供程序,您可以从中提取结构化数据,而不是尝试手动解析它:
DbPedia - 如前所述,提供了可用于数据查询的SPARQL端点。有许多库可用于多个平台,包括PHP。
Freebase - 另一个广告素材公用数据提供商。初始数据集基于已解析的维基百科数据,但有一些信息来自其他来源。任何人都可以编辑数据集,与维基百科相比,您可以使用自定义的架构将自己的数据添加到自己的命名空间中。使用自己的名为MQL的查询语言,它基于JSON。数据有WebID链接回到维基百科的相应文章。 Free base还提供了许多可下载的数据转储。 Freebase有许多客户端库,包括PHP。
Geonames - 地理位置数据库。有API提供给定坐标,附近位置(例如城市,火车站等)的国家和地区信息
Opensteetmap - 社区建立的世界地图。 API允许按位置和类型查询对象。
Wikimapia API - 其他位置服务
答案 4 :(得分:2)
要加载已解析的第一部分,只需将此参数添加到api url
的末尾即可rvparse
然后解析html以获取信息框表(使用Regex)
$url = "http://en.wikipedia.org/w/api.php?action=query&prop=revisions&rvprop=content&format=json&titles=Niger&rvsection=0&rvparse";
$data = json_decode(file_get_contents($url), true);
$data = current($data['query']['pages']);
$regex = '#<\s*?table\b[^>]*>(.*)</table\b[^>]*>#s';
$code = preg_match($regex, $data["revisions"][0]['*'], $matches);
echo($matches[0]);
答案 5 :(得分:1)
答案 6 :(得分:0)
要对此进行一些更新:Wikipedia信息框中的许多数据现在都来自Wikidata,这是一个免费的结构化信息数据库。例如,请参见data page for Germany,有关如何以编程方式访问数据的信息,请参见https://www.wikidata.org/wiki/Wikidata:Data_access。
答案 7 :(得分:0)
def extract_infobox(term):
url = "https://en.wikipedia.org/wiki/"+term
r = requests.get(url)
soup = BeautifulSoup(r.text, 'lxml')
tbl = soup.find("table", {"class": "infobox"})
if not tbl:
return {}
list_of_table_rows = tbl.findAll('tr')
info = {}
for tr in list_of_table_rows:
th = tr.find("th")
td = tr.find("td")
if th is not None and td is not None:
innerText = ''
for elem in td.recursiveChildGenerator():
if isinstance(elem, str):
# remove references
clean = re.sub("([\[]).*?([\]])", "\g<1>\g<2>", elem.strip())
# add a simple space after removing references for word-separation
innerText += clean.replace('[]','') + ' '
elif elem.name == 'br':
innerText += '\n'
info[th.text] = innerText
return info
答案 8 :(得分:-5)
我建议对维基百科执行WebRequest。从那里您将拥有该页面,您可以使用正则表达式,字符爬行或您熟悉的其他表单简单地解析或查询所需的数据。基本上是一个屏幕刮!
编辑 - 我想补充一点,你可以在C#land中使用HtmlAgilityPack。对于PHP,它看起来像SimpleHtmlDom。虽然说维基百科看起来有一个足够的API。这个问题可能最能满足您的需求: