2016-06-10 23 views
0

我一直在试图弄清楚如何从页面获取所有数据到jsonp。 我现在有正确的链接,但我已经遇到了2个问题。这是我使用(使用栈溢出为例),以收到的JSONP的网址:维基百科jsonp - 提取页面编号

https://en.wikipedia.org/w/api.php?action=query&prop=extracts&titles=stack%20overflow&format=json&callback=JSONP_CALLBACK

第1期: 当我做res.data,我得到的所有资料,但我似乎无法弄清楚如何获得通过页码:

JSONP_CALLBACK (
{ 
"batchcomplete": "", 
"query": { 
"normalized": [ 
{ 
"from": "stack overflow", 
"to": "Stack overflow" 
} 
], 
"pages": { 
"1436888": { // This is where I get stuck.. 
"pageid": 1436888, 
"ns": 0, 
"title": "Stack overflow", 
"extract": "<p>In software, a <b>stack overflow</b> occurs if the call stack pointer exceeds the stack bound. The call stack may consist of a limited amount of address space, often determined at the start of the program. The size of the call stack depends on many factors, including the programming language, machine architecture, multi-threading, and amount of available memory. When a program attempts to use more space than is available on the call stack (that is, when it attempts to access memory beyond the call stack's bounds, which is essentially a buffer overflow), the stack is said to <i>overflow</i>, typically resulting in a program crash.</p>\n<p></p>\n<h2><span id=\"Infinite_recursion\">Infinite recursion</span></h2>\n\n<p>The most common cause of stack overflow is excessively deep or infinite recursion, in which a function calls itself so many times that the space needed to store the variables and information associated with each call is more than can fit on the stack.</p>\n<p>An example of infinite recursion in C.</p>\n\n<p>The function <i>foo</i>, when it is invoked, continues to invoke itself, allocating additional space on the stack each time, until the stack overflows resulting in a segmentation fault. However, some compilers implement tail-call optimization, allowing infinite recursion of a specific sort—tail recursion—to occur without stack overflow. This works because tail-recursion calls do not take up additional stack space.</p>\n<p>C compiler options will effectively enable tail-call optimization; compiling the above simple program using gcc with <code>-O1</code> will result in a segmentation fault, but not when using <code>-O2</code> or <code>-O3</code>, since these optimization levels imply the <code>-foptimize-sibling-calls</code> compiler option. Other languages, such as Scheme, require all implementations to include tail-recursion as part of the language standard.</p>\n<h2><span id=\"Very_deep_recursion\">Very deep recursion</span></h2>\n<p>A recursive function that terminates in theory but causes a call stack buffer overflow in practice can be fixed by transforming the recursion into a loop and storing the function arguments in a stack. This is always possible, because the class of primitive recursive functions is equivalent to the class of LOOP computable functions. Consider this example in C++-like pseudocode:</p>\n<p>A primitive recursive function like the one on the left side can always be transformed into a loop like on the right side.</p>\n<h2><span id=\"Very_large_stack_variables\">Very large stack variables</span></h2>\n<p>The other major cause of a stack overflow results from an attempt to allocate more memory on the stack than will fit, for example by creating local array variables that are too large. For this reason some authors recommend that arrays larger than a few kilobytes should be allocated dynamically instead of as a local variable.</p>\n<p>An example of a very large stack variable in C:</p>\n\n<p>The declared array consumes 8 mebibytes of data (assuming each double is 8 bytes); if this is more memory than is available on the stack (as set by thread creation parameters or operating system limits), a stack overflow will occur.</p>\n<p>Stack overflows are made worse by anything that reduces the effective stack size of a given program. For example, the same program being run without multiple threads might work fine, but as soon as multi-threading is enabled the program will crash. This is because most programs with threads have less stack space per thread than a program with no threading support. Because kernels are generally multi-threaded, people new to kernel development are usually discouraged from using recursive algorithms or large stack buffers.</p>\n<h2><span id=\"See_also\">See also</span></h2>\n\n<ul><li>Buffer overflow</li>\n<li>Call stack</li>\n<li>Heap overflow</li>\n<li>Stack buffer overflow</li>\n<li>Double fault</li>\n</ul><h2><span id=\"References\">References</span></h2>\n\n<p>Kernel Programming Guide https://developer.apple.com/library/mac/documentation/Darwin/Conceptual/KernelProgramming/KernelProgramming.pdf</p>\n<h2><span id=\"External_links\">External links</span></h2>\n<ul><li>The reasons why 64-bit programs require more stack memory</li>\n</ul>" 
    } 
    } 
    } 
} 
) 

随着我的结果,我最多可以得到如下:res.data.query.pages但当我到达页面编号(这是随机的)时,我似乎无法弄清楚如何o获取信息。

问题2: 我要明显得到从JSONP的extract,但正如你可能已经看到上面了,它拥有所有这些标签,ECT,不会给一个好的输出..有显示方式这作为HTML?

回答

1

为了提取你可以使用下面的代码页ID:

var theObj = res.data.query.pages; 
var thePageId = theObj[Object.keys(theObj)[0]].pageid; 
// Object.keys(theObj)[0] will extract the value of the first property which is variable in your case and you don't know it. So we have the object which we know it has the property "pageid". 

在这里,您有哪些提醒页面的ID的小提琴:https://jsfiddle.net/fg6mdrxj/

关于第二个问题,一旦你得到该属性的值可以轻松操纵它。 在同一拨弄你在这里的更新:https://jsfiddle.net/fg6mdrxj/1/,是以提取属性的值,并将其添加到编号提取物格:

JS:

var toHtml = theObj[Object.keys(theObj)[0]].extract; 
document.getElementById("extract").innerHTML = toHtml; 

HTML:

<div id="extract"></div> 

当然,提取的价值可以用不同的方式操纵,一旦你得到它。

+0

一个小问题,在底部,有一些外部链接。有没有办法让这些链接进入json aswel。我猜我需要更新我的JSON链接并添加一个参数,但我不知道要添加什么。 – Borni

+0

我不知道如何更改url结构来返回json上的不同属性,但也许你可以在他们的文档中找到它。另一个解决方案是从提取属性中提取URL并将它们添加到数组中。你可以检查这个答案,看看它是如何使用正则表达式完成的:http://stackoverflow.com/questions/1986121/match-all-urls-in-string-and-return-in-array-in-javascript –