让我们把你的问题颠倒过来,从理论开始。方法论可能是一个更好的词。
您想在结构化页面中获取特定内容。为此,您要么需要一种方法来直接访问元素(如果它以我们可以访问的独特方式进行标记,则可以这样做),或者您需要或多或少地手动导航结构。您已经知道如何查看页面的来源,因此您对这一步很熟悉。这是 Firefox Inspector 的屏幕截图,突出显示了我们感兴趣的元素。
我们可以看到通向表格的元素的层次结构:html、body、div、div、div.ticker、table.ticker_data。我们还可以看到源码:
<table class="ticker_data">
整洁的!贴上了标签!不幸的是,当我们在脚本中处理 HTML 时,该类信息会被丢弃。真可惜。如果是这样id="ticker_data"
,我们可以使用这个答案中的 getElementByVal() 实用程序来实现它,并让我们自己免受未来页面重组的影响。在里面放一个别针-我们会回来的。
它可以帮助在调试器中可视化这一点。这是一个实用程序脚本 - 在调试模式下运行它,您将布置好 HTML 文档以供探索:
/**
* Debug-run this in the editor to be able to explore the structure of web pages.
*
* Set target to the page you're interested in.
*/
function pageExplorer() {
var target = "http://www.bloomberg.com/markets/companies/country/hong-kong/";
var pageTxt = UrlFetchApp.fetch(target).getContentText();
var pageDoc = Xml.parse(pageTxt,true);
debugger; // Pause in debugger - explore pageDoc
}
这是我们的页面在调试器中的样子:
您可能想知道编号元素是什么,因为您在源代码中看不到它们。当 XML 文档中有多个相同级别的元素类型时,解析器将它们显示为一个数组,编号为0..n
。因此,当我们在调试器中看到0
a 下方时div
,这告诉我们在该级别的 HTML 源代码中有多个<div>
标签,我们可以将它们作为数组访问,例如.div[0]
.
好的,我们背后的理论,让我们继续看看我们如何通过蛮力访问表。
知道层次结构,包括调试器中显示的 div 数组,我们可以这样做,ala Phil 之前的回答。我会做一些奇怪的缩进来说明文档结构:
...
var target = "http://www.bloomberg.com/markets/companies/country/hong-kong/";
var pageTxt = UrlFetchApp.fetch(target).getContentText();
var pageDoc = Xml.parse(pageTxt,true);
var table = pageDoc.getElement()
.getElement("body")
.getElements("div")[0] // 0-th div under body, shown in debugger
.getElements("div")[5] // 5-th div under there
.getElement("div") // another div
.getElement("table"); // finally, our table
作为所有这些调用的更紧凑的替代方案.getElement()
,我们可以使用点符号进行导航。
var table = pageDoc.getElement().body.div[0].div[5].div.table;
就是这样。
让我们回到那个固定的想法。在调试器中,我们可以看到元素附加了各种属性。特别是,该 div[5] 上有一个“id”,其中包含包含表的 div。请记住,在源代码中我们看到了“类”属性,但请注意它们并没有做到这一点。
尽管如此,一个好心的程序员把这个“id”放在适当的位置意味着我们可以做到这一点,getDivById()
从前面的问题来看:
var contentDiv = getDivById( pageDoc.getElement().body, 'content' );
var table = contentDiv.div.table;
如果他们移动东西,我们可能仍然能够找到该表,而无需更改我们的代码。
有了表格元素后,您已经知道该怎么做,所以我们到此完成!