我正在构建一个iOS和Android应用程序,它扫描条形码并从零售商网站上显示该书的产品页面。但现在,我只想从该产品页面获得价格而不是整页。
如何从页面中提取产品的价格,因为RedLaser使用它自己的应用程序。
产品页面:http://goo.gl/rDxAg 价格:321卢比
我想要this之类的东西,它可以在iOS和Android上实现,而无需使用外部服务器。
我是新手,所以任何帮助都将受到高度赞赏。
答案 0 :(得分:6)
如果网站上的官方API不可用,那么您必须解析下载的html以获取所需的数据。 iOS和Android都有许多第三方html解析器库。
对于iOS,请查看parsing HTML on the iPhone。
对于Android,请查看Parse HTML in Android。
两个链接中都有一些代码示例向您展示了如何实现此目的。
希望有所帮助。
答案 1 :(得分:3)
在此简介之后提供 jsFiddle演示。
您使用的当前产品页面包含太多数据只是为了得到价格。
最好使用Flipkart.com移动网站,因为加载速度更快。
参考1: http://www.flipkart.com/m/books
由于您的应用必须已使用图书的pid编号,因此您可以查询移动网页搜索!您的问题中的链接适用于pid
9780224060875
参考2: http://www.flipkart.com/m/search-all?query=9780224060875
在该页面上,您可以看到图书价格位于 Span Tag
内,其中 Class Name
为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加载搜索网址。
为了说明上述失败,这里是一个jsFiddle演示,当用浏览器控制台查看时,将显示在AJAX连接完成后没有获得任何内容。
参考3: jsFiddle flipkart.com Demo
推荐的解决方案:这里只有一个真正的选择。使用具有可用API的书店。该API(可能具有特权访问API密钥)将允许您成为合法的商店代表。
也许他们最终会提供API。现在,他们有一个Mobile App Store MP3收集。看看MP3如何反映音频书籍,它们也可能是一个时间问题,他们也提供了一个移动应用商店的书籍。
答案 2 :(得分: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);
您可以使用类似的功能来获取数据,或使用其他解决方案进行网页搜索
答案 3 :(得分:1)
您可以获得产品页面的网址,以提取您可以使用的价格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
答案 4 :(得分:1)
如果零售商提供,您可以使用API。搜索它!
如果没有可用的API,您可以从零售商服务器请求页面并将HTML解析为XML以获取包含价格的元素。但是,如果零售商改变它的网站,那可能会被打破。另外,问他是否允许你使用他的价格。
答案 5 :(得分: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
。 Download from here
现在使用这个库,解析更容易,你所要做的就是。
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" />