3

バーコードをスキャンし、小売業者の Web サイトからその本の製品ページを表示する iOS および Android アプリを構築しています。しかし今、ページ全体ではなく、その製品ページから価格を取得したいだけです。

RedLaser が独自のアプリで行っているように、ページから製品の価格を抽出するにはどうすればよいですか。

製品ページ: http://goo.gl/rDxAg 価格: Rs 321

このようなものが欲しいのですが、外部サーバーを使用せずに iOS と Android に実装できます。

私は初心者なので、どんな助けでも大歓迎です。

4

6 に答える 6

6

Web サイトの公式 API が利用できない場合は、ダウンロードした html を解析して必要なデータを取得する必要があります。iOS と Android の両方で利用できるサードパーティの html パーサー ライブラリが多数あります。

iOS の場合は、iPhone での HTML の解析を確認してください。

Android の場合は、 Android での HTML の解析を確認してください。

両方のリンクにいくつかのコード サンプルがあり、その方法を示しています。

それが役立つことを願っています。

于 2012-07-07T22:42:38.057 に答える
3

この簡単な紹介の後に、jsFiddle デモが提供されています。

現在使用している製品ページには、価格を取得するにはデータが多すぎます。

Flipkart.com Mobile Website for Books を使用すると、読み込みが速くなります。

参考1: http ://www.flipkart.com/m/books

アプリは書籍の pid 番号を既に使用している必要があるため、モバイル Web ページ検索を実行できます。あなたの質問のリンクは、の本へのリンクpidです9780224060875

参考2: http ://www.flipkart.com/m/search-all?query=9780224060875

そのページでは、Book Price が の 内にあることがわかりSpan Tagます。Class Namesp

<!-- Fragment of product price format -->
<div id="productpage-price">
 <p>
     Price:  <del> Rs. 350</del>
  <span class="sp">Rs. 263</span>
 </p>
</div>

次に、jQuery を使用して、次のように必要な価格データを取得できます。

// Begin section to show random methods to use HTML values

    // Get the HTML of  "Rs. 263" and store it in variable as a string.
    var priceTextAndLabel = $('#productpage-price').find('span.sp').text();

    // Get the HTML of  "Rs. 263" and slice off the first 4 characters of "Rs. " leaving "263" only.
    // Adjust the .slice() if possiable that number is after decimal point. Example: "Rs.1000"
    var priceText = $('#productpage-price').find('span.sp').text().slice(4);

    // As above but convert text string of "263" to a number (to allow JavaScript Math if req.).
    // The value 10 seen below reflects decimal base 10 (vs, octal(8) example) for .parseInt();
    var priceNumber = parseInt($('#productpage-price').find('span.sp').text().slice(4),10);

    // Firefox with Firebug Console will show BLACK characters for "Rs. 263" since it's a "string".
    console.log( priceTextAndLabel );

    // Firefox with Firebug Console will show BLACK characters for "263" since it's a "string".
    console.log( priceText );

    // Firefox with Firebug Console will show BLUE characters for "263" since it's a "number".
    console.log( priceNumber );

// End section to show random method to use HTML values

さて、重要な部分です...あなたが待ち望んでいた部分です...それは、flipkart.com 検索 URL を目標 (または Web ページ) で使用する方法です。

悲しい答えは、あなたにはできないということです。彼らはそれを禁止するだけでなく、ブロックします。つまり、Web ページを iframe にしたり、AJAX を使用して検索 URL をロードしたりすることはできません。

上記の失敗を説明するために、ブラウザー コンソールで表示すると、AJAX 接続が完了した後に何も取得されなかったことを示す jsFiddle デモを次に示します。

リファレンス 3: jsFiddle flipkart.com のデモ


推奨される解決策:ここでの実際の選択肢は 1 つだけです。使用可能な API がある書店を使用してください。その API は、特権アクセス用の可能な API キーを使用して、正規の店舗担当者になることができます。

おそらく、彼らは最終的に API を提供することになるでしょう。現在、彼らはMP3 コレクション用のMobile App Storeを持っています。MP3 がどのようにオーディオ ブックを反映できるかを見ると、ブック用のモバイル アプリ ストアも提供するのは時間の問題かもしれません。

于 2012-07-11T06:12:21.213 に答える
1
<span class="price final-price our fksk-our" id="fk-mprod-our-id">
   Rs.
   <span class="small-font"> </span>
   315
</span>

HTML私はこれがあなたのためにそこにあることに気づきましたPrice tag

のご利用をご提案いたしますjSoupここからダウンロード

このライブラリを使用すると、解析がはるかに簡単になり、必要なことはすべてです。

 Document doc = null;

    try{
        doc = Jsoup.connect("You page URL comes here").get(); // get url contents
    }catch(IOException e){
         // Handle exception here.
    }

 String priceHtml = doc.select("#fk-mprod-our-id").get(0).html().trim(); // get specific tag
 System.out.println("html fetched: "+priceHtml); //print to check if right tag is selected
 priceHtml = priceHtml.replace("((<span(.)*?>)(.)*(</span>))", ""); // replace inner span using regex.
 System.out.println("My Price tag: "+priceHtml); 

上記のコードはテストしていませんが、動作するはずです。小さな誤差が含まれる場合があります。しかし、少しの努力でそれを機能させることができます。

Parsingデータには時間がかかる場合があります。バックグラウンドで実行する必要があります。バックグラウンドでの解析が完了したら、データを UI スレッドに投稿します。

編集:

connect通話を で囲みますtry catch

で次の権限を設定していることを確認してくださいandroidManifest.xml

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
于 2012-07-08T07:47:22.190 に答える
1

私はeコマースで働いていますが、一部のCSVでサプライヤーサイトからデータを取得する必要がある場合があります。一部のサイトで要素を使用するルーチンを作成できます。この場合、ここで価格を見つけることができます:

xpath: //div[3]/div[2]/div/div/div/span

Selenium と Perl を使用したこの例のように:

open (INFO, '>>file.csv') or die "$!";  
my $sel = Test::WWW::Selenium->new( host => "localhost", 
                                    port => 4444, 
                                    browser => "*chrome", 
                                    browser_url => "http://www.example.com/page.htm" );
$sel->open_ok("/page.htm");
$sel->click_ok("//table[2]/tbody/tr/td/a/img");
$sel->wait_for_page_to_load_ok("30000");
my $price = $sel->get_text("//div[3]/div[2]/div/div/div/span");
print INFO ("$price\n");
$sel->go_back_ok();

# Close file
close (INFO);

同様の関数を使用してデータを取得するか、別のソリューションを使用して Web スクレイピングを行うことができます

于 2012-04-19T17:56:56.690 に答える
1

商品ページのURLを取得し、のこぎりを使って価格を抽出する方法

最初にページのコンテンツを取得してから、何らかの方法を使用して価格を取得する必要があります。CSS または xpath でこれを行うことができます

Nokogiri の基本的な例から:

require 'nokogiri'
require 'open-uri'

doc = Nokogiri::HTML(open('http://www.YOUR_URL_HERE.com'))
price = doc.at_xpath("//span[@id='fk-mprod-our-id']").text
于 2012-04-19T17:57:08.277 に答える
1

You could use an API if provided by the retailer. Search for it!
And if there isn't an API available, you could request the page from the retailers server and parse the HTML as XML to get the element which contains the price. However, that could be broken if the retailer changes it's site. Also, ask if he allows you to use his prices.

于 2012-04-19T17:58:21.163 に答える