web-dev-qa-db-ja.com

現在の価格をウェブサイトからスプレッドシートにインポートする

おそらくタイトルから収集できるように、目標はこの製品の現在の価格をスプレッドシートに組み込むことです。おそらく私は物事を過度に複雑にしていますが、これを行う簡単な方法がなければなりません。

私が取ったルートは、GoogleSheetsのIMPORT XML機能を利用することです。私はおそらく構文エラーに遭遇しているように感じます、私はちょうどそれを正しくすることができないようです。現在、私のセルは次のようになっています。

=IMPORTXML("http://www.walmart.com/ip/Morton-Sea-Salt-Fine-Salt-17.6-oz/10849552", "id('WM_PRICE')/x:div/x:div/x:span/x:span[2]")

Xpathチェッカーと呼ばれるFirefoxの拡張機能を使用して、Webサイトから価格設定要素のXpathを取得しましたが、アプリケーションが承認していないようです。残念ながら、この方法での(「単純な」スクレイピングツールとしての)GoogleSheetsの使用に関するドキュメントはあまり見つかりませんでした。

更新

ImportHTMLを試しました。サイトの18行目と19行目の間に価格がネストされているようです。したがって、次を使用しても機能しません。

=IMPORTHTML("http://www.walmart.com/ip/Morton-Sea-Salt-Fine-Salt-17.6-oz/10849552", "list", 18)

価格を含むノードの一意のセレクターは

#WM_PRICE > div:nth-child(1)

これを使用してGoogleスプレッドシートの情報を配信するだけの方法はありませんか?

解決

OKおそらくもっと良い方法があります。私の解決策:

=MID(Query(IMPORTHTML("http://www.walmart.com/ip/Morton-Sea-Salt-Fine-Salt-17.6-oz/10849552", "table", 2), "SELECT Col1 LIMIT 1"),8,6)

HTTPビットを変更することで、Walmart.comで99.99ドル以下の価格を効果的に取得できるようになりました(編集:いくつかのテストの後、FOODのみで動作し、他のアイテムのページレイアウトは異なります)小数点以下の桁を失います。幸いなことに、このカテゴリに分類されるアイテムはあまり必要ありません。

式の説明:

最初は貴重なデータをインポートすることでしたが、次の方法で生のインポートを実現しました。

IMPORTHTML("http://www.walmart.com/ip/Morton-Sea-Salt-Fine-Salt-17.6-oz/10849552", "table", 2)

しかし、いくつかの列と行をインポートしましたが、ブエノはインポートしませんでした。そこで、列1を「選択」し、行を1に「制限」することでそれらを切り落としました。

Query((), "SELECT Col1, LIMIT 1")

しかし、それは私に単一の不正なセルを残しました:式は$値の前にWord Onlineを返し(そしてその後に大量のジャンク)、私は8文字を文字列に解析し、MIDコマンドを介して6文字後に解析を停止しました(幸いなことに、金額の後に単一のスペースバッファがありました)。

=MID((),8,6)

そして、それは人々です。他の誰かがこれを行うためのよりエレガントな方法を持っている場合は、まだコメントしてください。将来このようなことをしようとしている人のために、足掛かりを残したかっただけです。

3
Bill-Skates

Importxmlのエラーはxpath構文にありました。これが正しいものです:

=CONCATENATE(IMPORTXML("http://www.walmart.com/ip/Morton-Sea-Salt-Fine-Salt-17.6-oz/10849552","//*[@itemprop='price'][1]"))

編集:xpathの末尾に[1]を追加して、価格が重複しないようにしました。

2

最終的に、私はGoogleの機能ではできません。その結果、カスタム関数を作成することにしました。

enter image description here

ツール->スクリプトエディターに移動します。左側の"Spreadsheet"をクリックして、新しいドキュメントを作成します。下にスクロールして、次のコードを貼り付けます。

enter image description here

function getWalmartPrice(url) {
  var html = UrlFetchApp.fetch(url).getContentText(); //Can't create document element ^_^
  html = html.substring(html.indexOf("bigPriceText1"));
  html = html.substring(html.indexOf(">") + 1);
  var txt = html.substring(0, html.indexOf("<"));
  //same thing for the small price
  html = html.substring(html.indexOf("smallPriceText1"));
  html = html.substring(html.indexOf(">") + 1);
  return txt + html.substring(0, html.indexOf("<"));
};

書くのは面倒でした(XHR、_documentなどはありません)が、DOM要素のコンテンツを見つけるためのJavaScript文字列操作の束にすぎません。

enter image description here

保存ファイル-[ファイル]-> [保存]、control/command-S、または上記のボタンをクリックします。おそらく、許可に関連する一連のメッセージが表示されます。また、プロジェクトに名前を付ける必要があります(ファイルがCode.gsという名前である限り、プロジェクトの名前は関係ありません)自動的にです)。これで、スプレッドシートに戻ってテストできます。関数は=getWalmartPrice(<url>)です。関数名を記述するときにツールチップがカスタム関数にポップアップ表示されないため、表示されなくても心配する必要はありません。

サンプルを次に示します。

enter image description here

=getWalmartPrice("http://www.walmart.com/ip/Morton-Sea-Salt-Fine-Salt-17.6-oz/10849552")
=getWalmartPrice("http://www.walmart.com/ip/Dell-Pre-Owned-Refurbished-Silver-745-Desktop-PC-with-Intel-Core-2-Duo-Processor-4GB-Memory-750-Hard-Drive-and-Windows-7-Professional-Monitor-Not/21907344")

コードがユニバーサルであることを示すために、2番目の例を含めました。さまざまな部門の製品(電子機器など)および99.99ドルを超えるものに使用できます。コードは$209.18を正しく返します。

文字列ではなく数字が必要な場合は、文字列ではなく数字のみを抽出するようにコードを簡単に変更できます。 txt.match(/\d/g).join("");を実行して文字列から数字のみを取得し、もちろんそれを解析していくつかの操作を行うことができます。

1
Shahar

次のセットアップは価格を返します。

A1:http://www.walmart.com/ip/Morton-Sea-Salt-Fine-Salt-17.6-oz/10849552
A2:(//div[@itemprop='price'])[1]
A3式:=CONCATENATE(IMPORTXML(A1,A2))
A3結果:$2.35

0
Rubén