/******************************************************************************
* Compilation: javac StockQuote.java
* Execution: java StockQuote symbol
* Dependencies: In.java, StdOut.java
*
* Print the stock price of the stock with the given symbol.
* Screen scrapes http://finance.yahoo.com to get the current price
* and associated information.
*
* Warning: if Yahoo updates the format of their page,
* this program also needs to be updated.
*
* % java StockQuote GOOG
* 744.0
* Alphabet Inc.
* Wed Jul 27 12:19:16 PDT 2016
*
* % java StockQuote AAPL
* 103.78
* Apple Inc.
* Wed Jul 27 12:19:21 PDT 2016
*
* % java StockQuote IBM
* 162.29
* International Business Machines Corporation
* Wed Jul 27 12:19:26 PDT 2016
*
* % java StockQuote MSFT
* 56.46
* Microsoft Corporation
* Wed Jul 27 12:19:30 PDT 2016
*
******************************************************************************/
public class StockQuote {
// Given symbol, get HTML
private static String readHTML(String symbol) {
In page = new In("http://finance.yahoo.com/quote/" + symbol);
String html = page.readAll();
if (html.contains("
")) return null;
else return html;
}
// Given symbol, get current stock price.
public static double priceOf(String symbol) {
String html = readHTML(symbol);
int p = html.indexOf("price.0", 0); // "price.0" index
int from = html.indexOf(">", p); // ">" index
int to = html.indexOf("", from); // "" index
String price = html.substring(from + 1, to);
// remove any comma separators
return Double.parseDouble(price.replaceAll(",", ""));
}
// Given symbol, get current stock price.
public static double priceOf(String symbol, String html) {
int p = html.indexOf("price.0", 0); // "price.0" index
int from = html.indexOf(">", p); // ">" index
int to = html.indexOf("", from); // "" index
String price = html.substring(from + 1, to);
// remove any comma separators
return Double.parseDouble(price.replaceAll(",", ""));
}
// Given symbol, get current stock name.
public static String nameOf(String symbol, String html) {
int p = html.indexOf("symbol.$companyName", 0);
int from = html.indexOf(">", p);
int to = html.indexOf("", from);
String name = html.substring(from + 1, to);
return name;
}
// Given symbol, get current date.
public static String dateOf(String symbol, String html) {
int p = html.indexOf("adx.bf1.yahoo.com", 0);
int from = html.indexOf(" ", p);
int to = html.indexOf("-->", from);
String date = html.substring(from + 1, to);
return date;
}
public static void main(String[] args) {
String symbol = args[0];
String html = readHTML(symbol);
if (html == null) StdOut.println("Invalid symbol: " + symbol);
else {
StdOut.println(priceOf(symbol, html));
StdOut.println(nameOf(symbol, html));
StdOut.println(dateOf(symbol, html));
}
}
}