Sınıf birkaç temel methoddan ibaret, bunların ne işe yaradığından bahsetmek gerekirse:
findAfter(String key): key taginde başka bir tag başlayana kadar olan stringlerin bir listesini döner.
findBetween(String key): key taglerinin arasındaki stringlerinin bir listesini döner.
lookInside(String key): key taginin içine yani <key ... > şeklindeki stringlerini bir listesini döner.
findInside(String key, String attribute): key taglerinin içindeki att attributelerinin bir listesini döner. Eğer key tagi att attributeunu barındırmıyor ise listede o kısma "Not found!" stringi eklenir.
Bu sınıfın bir nesnesini oluşturmak içinse .html dosyasına bir FileInputStream, gerektiği takdirde ise bir charSet paremetresi vermek yeterli. Bazı Türkçe .html dosyalarını okurken sorun yaşadığım oldu. Bunun önüne geçmek için charSet olarak "ISO8859-9" stringini paremetre olarak girmek sorunu çözüyor.
HTMLReader.java
import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.util.ArrayList; import java.util.EmptyStackException; import java.util.List; import java.util.Scanner; import java.util.Stack; public class HTMLReader { private String html; public HTMLReader(String html) { this.html = html; } public HTMLReader(FileInputStream stream) throws IOException { try (Scanner scanner = new Scanner(stream)) { StringBuilder stringBuilder = new StringBuilder(); while (scanner.hasNextLine()) stringBuilder.append(scanner.nextLine() + "\n"); html = stringBuilder.toString(); } finally { stream.close(); } } public HTMLReader(FileInputStream stream, String charSet) throws IOException { try (Scanner scanner = new Scanner(stream, charSet)) { StringBuilder stringBuilder = new StringBuilder(); while (scanner.hasNextLine()) stringBuilder.append(scanner.nextLine() + "\n"); html = stringBuilder.toString(); } finally { stream.close(); } } public List<String> findAfter(String key) throws FileNotFoundException { List<String> list = new ArrayList<>(100); int a = html.indexOf('<'); while (a != -1) { int b = html.indexOf('>', a + 1); String tag = html.substring(a + 1, b); if (tag.equals(key) || tag.contains(key + " ")) { int c = html.indexOf('<', b + 1); String element = html.substring(b + 1, c); list.add(element.trim()); } a = html.indexOf('<', b + 1); } return list; } public List<String> findBetween(String key) throws FileNotFoundException { List<String> list = new ArrayList<>(100); Stack<Integer> stack = new Stack<>(); int a = html.indexOf('<'); while (a != -1) { int b = html.indexOf('>', a + 1); String tag = html.substring(a + 1, b); if (tag.equals(key) || tag.contains(key + " ")) { stack.push(b + 1); } else if (tag.equals("/" + key)) { try { String element = html.substring(stack.pop(), a); list.add(element.trim()); } catch (EmptyStackException e) { System.out.println("Beginning/Ending tag is not found..."); } } a = html.indexOf('<', b + 1); } return list; } public List<String> lookInside(String key) throws FileNotFoundException { List<String> list = new ArrayList<>(100); int a = html.indexOf('<'); while (a != -1) { int b = html.indexOf('>', a + 1); String tag = html.substring(a + 1, b); if (tag.contains(key)) { list.add(tag); } a = html.indexOf('<', b + 1); } return list; } public List<String> findInside(String key, String att) throws FileNotFoundException { List<String> list = new ArrayList<>(100); int a = html.indexOf('<'); while (a != -1) { int b = html.indexOf('>', a + 1); String tag = html.substring(a + 1, b); if (tag.contains(key)) { int c = tag.indexOf(att); if (c > 0) { c += att.length() + 2; int d = tag.indexOf("\"", c); list.add(tag.substring(c, d)); } else { list.add("Not found!"); } } a = html.indexOf('<', b + 1); } return list; } }
Hiç yorum yok:
Yorum Gönder