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

标签 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

此页面和大多数汽车页面都使用了特定于车辆的信息框模板之一,在本例中为“信息框汽车”(抱歉, block 太大了,我将在发布后对其进行编辑,因为我在移动设备上阅读了 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/其他 url,但我还无法单独使用 API 直接抓取信息框。另外,我不太确定使用 api.php 之间有什么区别? action=解析 url 与 index.php? action=raw - 欢迎任何澄清,尽管我认为不直接相关。以下是我尝试过的一些不成功的示例,每个示例都有不同的错误/结果:

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

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

这与各种其他信息框抓取问题不同,因为这些文章使用特定的信息框模板,该模板阻止我使用上面发布的非常成功的 API url,尽管我确信这是用户错误和简单的修复。感谢您花时间阅读和提供帮助!

编辑:建议的页面是我已经尝试过的方式,但失败了。在该页面上,我正在尝试“错误”的方法,直到有人(包括我自己)找出我做错了什么 - 假设非标准化/基本信息框模板有正确的方法。如果在一天左右的时间内无法获得任何新信息,我将接受当前建议的答案以奖励该用户的帮助 - 但我真的希望我能多尝试几次,这就是为什么我创建了一个帐户,并在搜索并未能从我检查的许多其他问题中找到答案后询问 hive 思维。顺便说一句,任何关注都是好的关注,所以感谢您花时间查看此内容!

最佳答案

维基百科信息框并非设计为可抓取的。它们主要是一个(前端!)模板机制;它们有时包含结构化数据这一事实是偶然的。

action=rawaction=parse 之间的区别很简单,raw 为您提供原始的 wiki 文本(就像您单击文章上的“编辑”链接时看到的那样),而 parse 为您提供渲染的 HTML。这些对于您的目的来说可能没有多大用处。

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

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

关于html - 如何使用维基百科的API仅抓取模板:Infobox Automobile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49950004/

相关文章:

node.js - Node ——和谐0x​​104567911

HTML 和 CSS 3 在 anchor 或使用位置使其成为 "right"时跨越不同的含义?

javascript - 如果下拉选择值为 1,JQuery 添加必需的属性

php - 从页面上的mysql中清除所有显示的记录

javascript - 向 json 查询添加变量

javascript - 如何取出select2中的数据,如果数据库中存的数据是Json响应的结果

html - html/css可以调整定义列表的间距吗?

json - 在 JSON 树数据库中存储聊天的最佳方式?

javascript - dust helper 依赖项是否捆绑在已编译的模板中?

node.js - 如何增加 Node.js 中 dns.resolve4() 的超时时间?