Using XPATH and HTML Cleaner to parse HTML/XML
(Using XPATH and HTML Cleaner to parse HTML/XML)
The Beautiful Life of Sun Vulcan()
この記事は「表示-非営利」に基づいて作成されています-一貫性」 パブリック プロトコル
この文は転載用に保存しておいてください: サンバルカンの美しい生涯 - このブログは、モバイルおよび IoT デバイスのアジャイル開発と研究に焦点を当てています: iOS、Android、Html5、Arduino、pcDuino、その他の記事は、こちらからブログの転載・転載は禁止ですので、ご協力をお願いいたします。
XPATH と HTML Cleaner を使用して HTML / XML を解析する
2010 年 1 月 5 日
タグ: android, 例, HTML, 解析, スクレイピング , XML, 取得したいコンテンツ (私の場合はほとんど常にデータです)。
つまり、(特に Web 関連のアプリケーションで) 非常に便利だと感じたのは、Web サイトから HTML を取得し、その HTML を解析してデータや探しているものを探し出す機能です (私の場合、それはほとんどの場合データです)。
私は実際にこの手法を使用して、ブラック ショールズ/インプライド ボラティリティ アプリケーションのリアルタイムの株式/オプションのインポートを実行しています。そのため、HTML を取得して解析し、「クエリ」を実行する方法の例を探している場合は、たとえば、XPATH を使用する場合は、この投稿があなたのためです。
さて、始める前に、これを行うには、プロジェクトのビルド パスで外部 JAR を参照する必要があります。私が使用する JAR は HtmlCleaner からのものです。 HtmlCleaner Example でその使用例も示していますが、それに加えて、私がどのように使用するかという例も示します
6
8
9
10
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
public class OptionScraper {
// 文字列形式の XPATH クエリの例 - 使用されます後で プライベート静的最終文字列 NAME_XPATH = "//div[@class='yfi_quote']/div[@class='hd']/h2" ;
プライベート静的最終文字列 TIME_XPATH = "//table[@id='time_table']/tbody/tr/td[@class='yfnc_tabledata1']" ;
プライベート静的最終文字列 PRICE_XPATH = "//table[@id='price_table']//tr//span" ;
// TAGNODE オブジェクト、その使用法は後で説明します private static TagNode ノード;
// 名前に基づいてストックオプションのデータを取得するのに役立つメソッド (つまり、GOUAA は Google のストックオプションの 1 つです) public static Option getOptionFromName(String name) throws XPatherExcept ion、ParserConfigurationException、SAXException、IOException、XPatherException {
// HTML を取得して解析したい URL String option_url = " http://finance.yahoo.com/q?s=" + name.toUpperCase();
// ここで HTMLCLEANER の出番です。ここで初期化します HtmlCleaner クリーナー = new HtmlCleaner(); CleanerProperties props = cleaner.getProperties(); props.setAllowHtmlInsideAttributes( true ); props.setAllowMultiWordAttributes( true ); props.setRecognizeUnicodeChars( true ); props.setOmitComments( true );
// 目的の URL への接続を開きます URL url = new URL(option_url); URLConnection conn = url.openConnection();
// クリーナーを使用して HTML を「クリーン」にし、TAGNODE オブジェクトとして返します Node = Cleaner.clean( new InputStreamReader(conn.getInputStream()));
// HTML がクリーンになったら、ノード上で XPATH 式を実行すると、TAGNODE オブジェクトの配列が返されます (これらはオブジェクトとして返されますが、下にキャストされます) オブジェクト[] info_nodes =ノード.evaluateXPath(NAME_XPATH); Object[] time_nodes = node.evaluateXPath(TIME_XPATH); オブジェクト[] 価格_ノード = node.evaluateXPath(PRICE_XPATH);
// ここで、XPATH が正しく、実際のノードが返されたことを確認するために簡単なチェックを行います if (info_nodes.length > 0 ) { // A にキャストされましたTAGNODE TagNode info_node = (TagNode) info_nodes[ 0 ]; // コンテンツを文字列として取得する方法 String info = info_node.getChildren().iterator().next().toString().trim();
// 情報の文字列を処理するメソッド (私の場合、これは株価情報など) processInfoNode(o, info); }
if (time_nodes.length > 0 ) { TagNode time_node = (TagNode) time_nodes[ 0 ]; 文字列日付 = time_node.getChildren().iterator().next().toString().trim();
// 日付は 15-JAN-10 の形式で返されるため、これはその文字列を私が使用する形式に解析するためだけに書いたメソッドです processDateNode(o,日付); }
if (price_nodes.length > 0 ) { TagNode 価格ノード = (タグノード) 価格ノード[ 0 ]; 二重価格 = Double.parseDouble(price_node.getChildren().iterator().next().toString().trim()); o.setPremium(価格); }
戻る o; } } |
それでは以上です!ビルド パスに JAR を含めると、あとはすべて非常に簡単です。とても使いやすいツールです。ただし、XPATH の知識が必要ですが、XPATH は習得するのがそれほど難しくなく、知っておくと便利です。知らない場合は、リンクを参照してください。
ここで、皆さんに警告です。 HtmlCleaner によって認識される XPATH 式は、「基本的な」XPATH のみが認識されるという意味では完全ではないことが文書化されています。何が除外されるのでしょうか?たとえば、「軸」演算子 (親、祖先、フォロー、兄弟など) は使用できませんが、私の経験では、それ以外はすべて問題ありません。はい、それは最悪ですし、多くの場合、それはあなたの生活を少し困難にする可能性がありますが、通常は、必要な情報を取得する前に、XPATH 式をもう少し賢くする必要があるだけです。
そしてもちろん、このテクニックXML ドキュメントでも同様に機能します!
これが皆さんのお役に立てば幸いです。どこか混乱している場合はお知らせください。
- jwei