我正在尝试将下表 - from link - 放到Google表格中。
我尝试了以下内容:
=IMPORTXML("http://www.immopreise.at/Wien/Wohnung/Miete","//table[@id='preisTabelle']")
附上您可以找到示例表:
https://docs.google.com/spreadsheets/d/1-aXJULo6BELQQ6136Lps_HUzOwkw5SKaPGxIl5gBDfM/edit?usp=sharing
我的问题是我什么都没收到。
有什么建议我做错了吗?
感谢您的回复!
答案 0 :(得分:4)
第一种方法:以下是如何做到这一点(使用ImportXml和RegexExtract:
=IMPORTXML("http://www.immopreise.at/Wien/Wohnung/Miete",
"//table[@id='preisTabelle']")
上述代码生成一个空字符串,因为该网页在该位置有一个空表,如下所示:
<table id="preisTabelle"></table>
数据实际上位于<script>
标记内:
<script>
var ImmoOptions = {"mapOptions":{"region":"Wien","karteAnzeigen":true},"TrendChartConf":{"uri":{"district":"/Trend/GetDistricts","chart":"/Trend/GetChart","chart1":"/Trend/GetTrendChart","compare":"/Preisvergleich","chart2":"/Trend/TrendChart","refresh":"/Preisentwicklung","uebersicht":"/?region=Wien\u0026pathInfo=Wohnung%2FMiete"},"firstDirstrict":{"Wien":"Wien-1-Innere-Stadt","Niederoesterreich":"Sankt-Poelten-Stadt","Burgenland":"Eisenstadt-Stadt","Oberoesterreich":"Linz-Stadt","Steiermark":"Graz-Alle-Bezirke","Kaernten":"Klagenfurt-Stadt","Salzburg":"Salzburg-Stadt","Tirol":"Innsbruck-Stadt","Vorarlberg":"Bregenz"},"firstDirstrictId":{"9":231,"3":153,"1":133,"4":177,"6":201,"2":142,"5":195,"7":218,"8":228}},"preisInfos":{"tabelle":{"spalten":[{"name":"≤50m²","spaltenArt":"Waehrung","nachkommaStellen":true,"farbmarkierung":null},{"name":"51-80m²","spaltenArt":"Waehrung","nachkommaStellen":true,"farbmarkierung":null},{"name":"81-129m²","spaltenArt":"Waehrung","nachkommaStellen":true,"farbmarkierung":null},{"name":"\u003e130m²","spaltenArt":"Waehrung","nachkommaStellen":true,"farbmarkierung":null},{"name":"\u003cspan class=\u0027Detailed\u0027\u003e\u0026#216;/m²\u003c/span\u003e\u003cspan class=\u0027Compact\u0027\u003e\u0026#216;/m²\u003c/span\u003e","spaltenArt":"Waehrung","nachkommaStellen":true,"farbmarkierung":true},{"name":"\u003cspan class=\u0027Detailed\u0027\u003eTrend\u003c/span\u003e\u003cspan class=\u0027Compact\u0027\u003eTd.\u003c/span\u003e","spaltenArt":"Tendenz","nachkommaStellen":false,"farbmarkierung":null}],"zeilen":[{"name":" 1., Innere Stadt","zellen":[21.68,19.02,18.43,19.56,19.27,0],"id":231},{"name":" 2., Leopoldstadt","zellen":[18.27,15.06,14.28,14.20,14.85,1],"id":232},{"name":" 3., Landstraße","zellen":[18.88,17.04,15.42,14.68,16.03,1],"id":233},{"name":" 4., Wieden","zellen":[19.37,16.58,16.89,16.35,16.83,1],"id":234},{"name":" 5., Margareten","zellen":[15.46,14.11,14.20,14.77,14.39,0],"id":235},{"name":" 6., Mariahilf","zellen":[18.23,14.68,15.72,15.32,15.53,1],"id":236},{"name":" 7., Neubau","zellen":[16.09,14.89,14.58,14.94,14.95,0],"id":237},{"name":" 8., Josefstadt","zellen":[16.77,16.78,14.02,14.93,15.08,0],"id":238},{"name":" 9., Alsergrund","zellen":[15.72,14.48,14.53,14.92,14.69,0],"id":239},{"name":"10., Favoriten","zellen":[14.14,12.35,11.81,0,12.52,0],"id":240},{"name":"11., Simmering","zellen":[13.69,12.34,11.50,13.46,12.38,-1],"id":241},{"name":"12., Meidling","zellen":[15.66,14.97,13.28,11.79,14.54,1],"id":242},{"name":"13., Hietzing","zellen":[16.71,15.93,14.63,14.05,14.99,0],"id":243},{"name":"14., Penzing","zellen":[14.43,13.14,12.72,12.37,13.11,0],"id":244},{"name":"15., Rudolfsheim-Fünfhaus","zellen":[13.58,12.90,12.93,11.76,13.07,0],"id":245},{"name":"16., Ottakring","zellen":[13.99,12.64,12.64,12.45,12.90,0],"id":246},{"name":"17., Hernals","zellen":[14.71,13.06,13.15,13.61,13.50,1],"id":247},{"name":"18., Währing","zellen":[14.47,13.96,13.82,15.67,14.37,0],"id":248},{"name":"19., Döbling","zellen":[16.21,14.37,15.06,16.44,15.29,0],"id":249},{"name":"20., Brigittenau","zellen":[15.68,13.57,12.56,13.30,13.43,0],"id":250},{"name":"21., Floridsdorf","zellen":[15.58,13.58,12.38,14.97,13.68,1],"id":251},{"name":"22., Donaustadt","zellen":[18.19,15.57,16.85,15.89,16.18,0],"id":252},{"name":"23., Liesing","zellen":[14.79,14.09,13.49,15.60,13.92,1],"id":253}],"tabellenTitel":"Wohnungen Miete","titelErsteSpalte":"Bezirk","GesamtAnzahlObjekte":12739},"preisspannen":[{"bis":12},{"bis":14},{"bis":15},{"bis":null}]},"basecharts":null,"CurrentView":{"trendVar":{"CatNum":0,"ImmoArtNum":5,"AltbauNum":2,"AngebotTypeNum":1},"hid":0}} ;
jQuery(function () {
InitMap(ImmoOptions.mapOptions);
});
</script>
最感兴趣的数据是在变量ImmoOptions中找到的:
[
{
"name": " 1., Innere Stadt",
"zellen": [21.68, 19.02, 18.43, 19.56, 19.27, 0],
"id": 231
},
{
"name": " 2., Leopoldstadt",
"zellen": [18.27, 15.06, 14.28, 14.2, 14.85, 1],
"id": 232
},
/* Edited for brevity */
]
以下公式可以将脚本放入电子表格中的单元格中(假设我们将其粘贴到单元格A [100]中)..
=IMPORTXML("http://www.immopreise.at/Wien/Wohnung/Miete","//script[2]")
然后,以下公式将JSON字符串(ImmoOptions变量的值)提取到单元格中(假设我们将以下内容粘贴到单元格A [1]中)..
=REGEXEXTRACT(A100,"(?s)=(.*)")
此时,我们需要javascript来解析JSON。这可以通过将工作表转换为 Google App (工具 - >脚本编辑器)并在javascript中进行编码来完成。
在javascript中,将有三个步骤(此处未显示详细信息):
1. Use IMPORTXML to get the data inside script (in the url/page)
2. Use REGEXEXTRACT to get the value of ImmoOptions as JSON string
3. Parse JSON string to get the data
第二种方法:以下是使用Google App / Script执行此操作的方法:
登录谷歌并在浏览器中打开this spreadsheet。
选择File->Make a Copy
(可能使用类似S1的名称)。这将在您的google云端硬盘中制作该文件的副本;并在新标签中打开它。
转到新窗口/标签。选择Tools->Script Editor
。这将使您进入带有脚本的编辑器。从工具栏中选择函数doGet
并运行脚本;它会生成电子表格。
以下是随工作表附上的脚本(供参考,以防链接丢失):
function doGet() {
var r1=Math.random()*100000000000;
var html = UrlFetchApp.fetch("http://www.immopreise.at/Wien/Wohnung/Miete?somevariable=" + r1).getContentText();
var re = /var ImmoOptions = (.*);/i;
var jo=JSON.parse(re.exec(html)[1]);
var arr=jo["preisInfos"]["tabelle"]["zeilen"];
var sheet = SpreadsheetApp.getActiveSheet();
sheet.clear(); sheet.appendRow([r1]);
sheet.appendRow(['Bezirk','Col-1','Col-2','Col-3','Col-4','Col-5','Col-6']);
for (var i=0;i<arr.length;i++) {
var item = arr[i]; var row=[item.name];
row=row.concat(item.zellen); sheet.appendRow(row);
}
}
工作原理:
<script>..</script>
<强>缺点:强>
<script>
包含的变化(或以任何其他方式正则表达式的突破)