3

我正在构建一个 iOS 和 Android 应用程序,它扫描条形码并从零售商网站显示该书的产品页面。但是现在,我只想从该产品页面而不是整个页面获取价格。

如何从页面中提取产品的价格,就像 RedLaser 使用它自己的应用程序一样。

产品页面: http: //goo.gl/rDxAg 价格:321 卢比

我想要这样的东西它可以在 iOS 和 Android 上实现,而无需使用外部服务器。

我是新手,所以任何帮助将不胜感激。

4

6 回答 6

6

如果网站上的官方 API 不可用,那么您必须解析下载的 html 以获取您想要的数据。有许多适用于 iOS 和 Android 的第三方 html 解析器库。

对于 iOS,请查看在 iPhone 上解析 HTML

对于 Android,请查看Parse HTML in Android

两个链接中都有一些代码示例向您展示了如何做到这一点。

希望有帮助。

于 2012-07-07T22:42:38.057 回答
3

在此简单介绍之后提供了一个jsFiddle Demo 。

您正在使用的当前产品页面包含太多数据,只是为了获取价格。

最好使用 Flipkart.com 移动图书网站,因为这样加载速度更快。

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

由于您的应用程序必须已经在使用该书的 pid 号,您可以查询移动网页搜索!pid您问题中的链接适用于一本书9780224060875

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

在该页面上,您可以看到 Book Price 在Span Tagwith Class Nameof内sp

<!-- 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。

可悲的答案是你不能。他们不仅禁止它,还阻止它。这意味着您不能 iframe 网页,甚至不能使用 AJAX 加载搜索 URL。

为了说明上述失败,这里有一个 jsFiddle Demo,当使用浏览器控制台查看时,将显示 AJAX 连接完成后没有获得任何内容。

参考3: jsFiddle Flipkart.com Demo


推荐的解决方案:这里只有一个真正的选择。使用具有可用 API 的书店。该 API 以及可能的API 密钥用于特权访问,将允许您成为合法的商店代表。

也许他们最终会提供一个 API。现在,他们有一个用于 MP3 收藏的移动应用商店。看到 MP3 如何反映有声读物,他们也为图书提供移动应用商店可能只是时间问题。

于 2012-07-11T06:12:21.213 回答
1

我在电子商务中工作,有时对于某些 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);

您可以使用类似的功能来抓取数据,或使用其他解决方案进行网页抓取

于 2012-04-19T17:56:56.690 回答
1

一个你得到产品页面的 url,你可以使用Nokogiri来提取价格

您首先需要获取页面内容,然后使用某种方法获取价格。您可以通过 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

如果零售商提供,您可以使用 API。搜索它!
如果没有可用的 API,您可以从零售商服务器请求页面并将 HTML 解析为 XML 以获取包含价格的元素。但是,如果零售商更改其网站,这可能会被打破。另外,询问他是否允许您使用他的价格。

于 2012-04-19T17:58:21.163 回答
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 回答