今日、テキストを抽出するために Python で書かれたものを見つけました。喜んで Java で実装し、Webmagic に入れました。その後、それがすでに Jsoup に存在していることがわかりました。とても信頼できないと感じました。そんなことは忘れて、落ち着いて良いことを学びましょう!
Jsoup は、Java の世界での HTML 解析とフィルタリングに最適です。 HTML の DOM ツリーへの解析をサポートし、CSS セレクターのフォーム選択をサポートし、HTML フィルタリングをサポートし、HTTP ダウンローダーも付属しています。今日からJsoupのソースコード解釈シリーズを書いていきます。 前回のブログと比べて、より詳しく書いてみます。
jsoup
§── 例 #例。HTML をプレーン テキストに変換する例と、すべてのリンク アドレスを抽出する例が含まれます。
§── ヘルパー #データの読み取り、接続の処理、文字列変換のためのツールを含むいくつかのツールクラス
§── ノード #DOM ノードの定義
├── パーサー #HTML を解析して DOM ツリーに変換します
§── 安全性 #ホワイトリストや HTML フィルタリングを含む安全性関連
└── #Selector を選択、CSS セレクターと NodeVisitor 形式のトラバーサルをサポート
使用
Jsoup への入り口は Jsoup クラスです。サンプル パッケージには 2 つの例が用意されています。html を解析した後、CSS Selector と NodeVisitor を使用してそれぞれ Dom 要素を操作します。
Jsoup を呼び出す方法を示す ListLinks の例を次に示します。
public static void main(String[] args) throws IOException { Validate.isTrue(args.length == 1, "usage: supply url to fetch"); String url = args[0]; print("Fetching %s...", url);// 下载url并解析成html DOM结构 Document doc = Jsoup.connect(url).get(); // 使用select方法选择元素,参数是CSS Selector表达式 Elements links = doc.select("a[href]");print("\nLinks: (%d)", links.size()); for (Element link : links) { //使用abs:前缀取绝对url地址 print(" * a: <%s> (%s)", link.attr("abs:href"), trim(link.text(), 35)); }}
もう 1 つの方法は、NodeVisitor を介して DOM ツリーをトラバースすることです。これは、HTML 全体を分析して置換する場合に便利です。
public interface NodeVisitor {//遍历到节点开始时,调用此方法 public void head(Node node, int depth);//遍历到节点结束时(所有子节点都已遍历完),调用此方法 public void tail(Node node, int depth);}HtmlToPlainText的例子说明了如何使用NodeVisitor来遍历DOM树,将html转化为纯文本,并将需要换行的标签替换为换行\n:public static void main(String... args) throws IOException { Validate.isTrue(args.length == 1, "usage: supply url to fetch"); String url = args[0];// fetch the specified URL and parse to a HTML DOM Document doc = Jsoup.connect(url).get();HtmlToPlainText formatter = new HtmlToPlainText(); String plainText = formatter.getPlainText(doc); System.out.println(plainText);}public String getPlainText(Element element) { //自定义一个NodeVisitor - FormattingVisitor FormattingVisitor formatter = new FormattingVisitor(); //使用NodeTraversor来装载FormattingVisitor NodeTraversor traversor = new NodeTraversor(formatter); //进行遍历 traversor.traverse(element); return formatter.toString();}