如何使用维基百科的API仅刮取模板:Infobox Automobile

时间:2018-04-20 21:32:01

标签: html json node.js parsing wikipedia-api

我正试图从大多数汽车页面中抓取有用的信息框,但是我搞砸了语法。从其他有用的SO帖子中,我发现了一种方便的方法来刮取标准的Infobox模板(给出的例子是氢气):

https://en.m.wikipedia.org/w/index.php?action=raw&title=Template:Infobox%20hydrogen

我可以使用类似的过程来拉动Ford Pinto页面(使用它,因为它只有一个信息框,因为只有一个,臭名昭着的模型代):

https://en.m.wikipedia.org/w/index.php?action=raw&title=Ford_Pinto

这个页面,以及大多数汽车页面,使用了一个特定于车辆的信息框模板,在这种情况下是“Infobox汽车”(对于这个大块,我打算编辑这个,因为我已经发布了移动,我读了SO格式):

{{Infobox automobile
| name = Ford Pinto
| image = Ford Pinto.jpg
| caption = Ford Pinto
| manufacturer = [[Ford Motor Company|Ford]]
| aka = Mercury Bobcat
| production = September 1970–1980
| model_years = 1971–1980 (Pinto)<br> 1974–1980 (Bobcat)
| assembly = '''United States:''' {{ubl|[[Edison, New Jersey]] ([[Edison Assembly]])|[[Milpitas, California]] ([[San Jose Assembly Plant|San Jose Assembly]])}}'''Canada:''' {{ubl|[[Southwold, Ontario]] ([[St. Thomas Assembly]])}}
| designer = Robert Eidschun (1968)<ref name=bbw20091030>
...
Snipped some useless stuff
...
</ref>
| class = [[Subcompact car]]
| body_style = 2-door [[Sedan (automobile)|sedan]]<br/>2-door [[sedan delivery]]<br/>2-door [[station wagon]]<br/> 3-door [[hatchback]]
| related = [[Ford Pinto#Mercury Bobcat (1974–1980)|Mercury Bobcat]]<br>[[Ford Mustang (second generation)|Ford Mustang II]]<br> [[Pangra]]
| layout = [[Front-engine, rear-wheel-drive layout|FR layout]]
| engine = {{unbulleted list
  | 1.6L ''[[Ford Kent engine|Kent]]'' I4
  | 2.0L ''[[Ford Pinto engine|EAO]]'' I4
  | 2.3L ''[[Ford Pinto engine|OHC]]'' I4
  | 2.8L ''[[Ford Cologne engine|Cologne]]'' V6
  }}
| transmission = {{unbulleted list
  | 4-speed manual
  | 3-speed ''[[Ford C3 transmission|C3/"Selectshift/Cruise-O-Matic"]]'' automatic
...
Snipped
...
</ref>
|wheelbase = {{convert|94.0|in|mm|abbr=on}}<ref>
...
Snipped
...
  }}
| wheelbase = {{convert|94.0|in|mm|abbr=on}}<ref>
...
Snipped
...
</ref>
| length = {{convert|163|in|mm|abbr=on}}
| width = {{convert|69.4|in|mm|abbr=on}}
| height = {{convert|50|in|mm|abbr=on}}
| weight = {{convert|2015|–|2270|lb|abbr=on}} (1971)
| predecessor = [[Ford Cortina|Ford Cortina (captive import)]]
| successor = [[Ford Escort (North America)|Ford Escort]]
}}

虽然没有上面那么漂亮,但另一种选择是使用REST API并将页面缩小到只有HTML的文章,这将让我使用标准的HTML解析器来提取Infobox HTML表格(链接)应该在chrome中工作,但肯定会在Android设备上运行):

视图源:https://en.wikipedia.org/api/rest_v1/page/html/Ford_Pinto

<table class="infobox hproduct" style="width:22em" about="#mwt7" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"Infobox automobile\n","href":"./Template:Infobox_automobile"}

我可以根据我想要的信息解析其中任何一个,即性能信息 - 模型,年份,动力传动系统布局,引擎,变速箱,轴距,重量 - 但是尽管尝试了各种API /其他网址,我还是无法仅使用API​​直接刮擦信息框。另外,我不确定使用api.php之间的区别是什么? action = parse url vs index.php? action = raw - 欢迎任何澄清,但我认为没有直接相关。以下是我尝试过的一些不成功的例子,每个例子都有不同的错误/结果:

https://en.wikipedia.org/w/&lt; - 将以下内容附加到此基本链接,因为我无法发布一堆链接

api.php?action=parse&page=Template:Infobox%20automobile%20Ford_Pinto&format=json

api.php?action=query&titles=Template:Infobox%20automobile%20Ford%20Pinto&prop=revisions&rvprop=content&format=json&formatversion=2

api.php?action=query&titles=Template:Infobox%20automobile%20Ford_Pinto&prop=revisions&rvprop=content&format=json&formatversion=2

index.php?action=raw&title=Template:Infobox%20automobile%20Ford_Pinto

index.php?action=raw&title=Template:Infobox%20automobile%20Ford%20Pinto

index.php?action=raw&titles=Template:Infobox%20automobile%20Ford_Pinto

index.php?action=raw&titles=Template:Infobox%20automobile%20Ford%20Pinto

这与各种其他Infobox抓取问题不同,因为这些文章使用特定的Infobox模板阻止我使用上面发布的非常成功的API网址,尽管我确定这是用户错误和简单修复。感谢您抽出时间阅读和协助!

编辑:建议的页面是我已经尝试过的方式,并且失败了。根据那个页面,我试图采用'错误'的方式,直到有人(包括我自己)弄清楚我做错了什么 - 假设有非正规的/基础信息模板的正确方法。如果在一天左右没有任何新信息,我会接受目前建议的答案,以奖励用户的帮助 - 但我真的希望我再多尝试一次,这就是为什么我创建了一个帐户并询问了蜂巢的想法在搜索并且未能从我检查的许多其他问题中找到答案之后。顺便说一句,任何关注都是很好的关注,所以谢谢你花时间去看看这个!

2 个答案:

答案 0 :(得分:0)

维基百科的信息框不是可以抓取的。它们主要是(前端!)模板机制;他们有时包含结构化数据的事实是偶然的。

action=rawaction=parse之间的区别只是raw为您提供了原始的wikitext(就像您点击了&#34;编辑&#34;链接文章),parse为您提供呈现的HTML。这些都不适用于您的目的。

您最好的选择是使用来自DBpedia等下游项目的数据,这些数据已经完成了解析这些文章的肮脏工作。例如,这里是福特平托的解析数据:

http://dbpedia.org/snorql/?describe=http%3A//dbpedia.org/resource/Ford_Pinto

答案 1 :(得分:0)

您可以使用页面Parsoid output https://en.wikipedia.org/api/rest_v1/page/html/Ford_Pinto,其中包含一个包含类infobox的表和一个包含一些JSON编码数据的data-mw。 我会寻找信息框(CSS选择器table.infobox)并在data-mw值上运行JSON.parse。检查信息框是否有href ./Template:Infobox_automobile然后查找正确的参数(在params字段中)。

这是一个示例请求:

curl -X GET --header 'Accept: text/html; charset=utf-8; profile="https://www.mediawiki.org/wiki/Specs/HTML/1.6.1"' 'https://en.wikipedia.org/api/rest_v1/page/html/Ford_Pinto'

除了Accept标题之外,还可以将User-Agent header设置为唯一字符串。