{"id":7305,"date":"2016-08-06T15:00:13","date_gmt":"2016-08-06T13:00:13","guid":{"rendered":"http:\/\/blog.wenzlaff.de\/?p=7305"},"modified":"2019-07-28T12:19:44","modified_gmt":"2019-07-28T10:19:44","slug":"jsoup","status":"publish","type":"post","link":"http:\/\/blog.wenzlaff.de\/?p=7305","title":{"rendered":"Java: Parsen von HTML-Dateien mit JSoup 1.9.2 in zwei Java Zeilen"},"content":{"rendered":"<p>Will man schnell und einfach HTML-Dateien parsen bzw. auswerten, geht das mit der sch\u00f6nen <a href=\"https:\/\/jsoup.org\/apidocs\/\" target=\"_blank\" rel=\"noopener noreferrer\">JSoup-Api<\/a>. <a href=\"http:\/\/kleinhirn.eu\/2016\/08\/10\/jsoup\/\" target=\"_blank\" rel=\"noopener noreferrer\">Hier<\/a> gibt es eine <a href=\"http:\/\/kleinhirn.eu\/2016\/08\/10\/jsoup\/\" target=\"_blank\" rel=\"noopener noreferrer\">Mindmap<\/a> f\u00fcr den schnellen \u00dcberblick.<\/p>\n<p>Es sind dann nur zwei Zeilen n\u00f6tig um z.B. den Titel einer Webseite einzulesen:<\/p>\n<pre class=\"lang:java decode:true \" title=\"Java Jsoup Beispiel\" >\r\n\r\nDocument doc = Jsoup.connect(\"http:\/\/reise.wenzlaff.de\/reisetabelle\/\").get();\r\nSystem.out.println(\"Der Titel der Website: \" + doc.title());\r\n\r\n<\/pre>\n<p>Hier mal ein Zitat aus der Orginal Api-Beschreibung:<\/p>\n<pre class=\"lang:default decode:true \" >\r\njsoup is a Java library for working with real-world HTML. \r\nIt provides a very convenient API for extracting and manipulating data, \r\nusing the best of DOM, CSS, and jquery-like methods.\r\n\r\njsoup implements the WHATWG HTML specification, \r\nand parses HTML to the same DOM as modern browsers do.\r\n\r\n    parse HTML from a URL, file, or string\r\n    find and extract data, using DOM traversal or CSS selectors\r\n    manipulate the HTML elements, attributes, and text\r\n    clean user-submitted content against a safe white-list, to prevent XSS\r\n    output tidy HTML\r\n\r\njsoup is designed to deal with all varieties of HTML found in the wild; \r\nfrom pristine and validating, \r\nto invalid tag-soup; j\r\nsoup will create a sensible parse tree.\r\n<\/pre>\n<p>Das sind doch Gr\u00fcnde!<\/p>\n<p>Es braucht in der <strong>pom.xml<\/strong> des Maven Projekte nur diese eine Abh\u00e4ngigkeit angegeben zu werden:<!--more--><\/p>\n<pre class=\"lang:xhtml decode:true \" >&lt;dependency&gt;\t\t\r\n\t\t  &lt;groupId&gt;org.jsoup&lt;\/groupId&gt;\r\n\t\t  &lt;artifactId&gt;jsoup&lt;\/artifactId&gt;\r\n\t\t  &lt;version&gt;1.9.2&lt;\/version&gt;\r\n&lt;\/dependency&gt;\r\n<\/pre>\n<p>Hier dann mal eine Beispiel-Klasse, die eine <a href=\"http:\/\/reise.wenzlaff.de\/reisetabelle\/\" target=\"_blank\" rel=\"noopener noreferrer\">Tabelle mit Reiseinformationen<\/a> mit den Orten wo ich war einfach auf der Konsole ausgibt:<\/p>\n<pre class=\"lang:java decode:true \" >\r\npackage de.wenzlaff.mqtt.client;\r\n\r\nimport org.jsoup.Jsoup;\r\nimport org.jsoup.nodes.Document;\r\nimport org.jsoup.select.Elements;\r\n\r\n\/**\r\n * Beispiel zum parsen von HTML Dateien mit JSoup.\r\n * \r\n * In pom.xml die folgenden Abh\u00e4ngigkeit erg\u00e4nzen:\r\n * \r\n * &lt;pre&gt;\r\n    &lt;dependency&gt;\r\n\t\t  &lt;!-- jsoup HTML parser library @ http:\/\/jsoup.org\/ --&gt;\r\n\t\t  &lt;groupId&gt;org.jsoup&lt;\/groupId&gt;\r\n\t\t  &lt;artifactId&gt;jsoup&lt;\/artifactId&gt;\r\n\t\t  &lt;version&gt;1.9.2&lt;\/version&gt;\r\n\t\t&lt;\/dependency&gt;\r\n * &lt;\/pre&gt;\r\n * \r\n * @author Thomas Wenzlaff\r\n * @version 0.1\r\n *\/\r\npublic class HtmlParser {\r\n\r\n\t\/**\r\n\t * Beispiel Programm\r\n\t * \r\n\t * @param args\r\n\t *            keine\r\n\t * @throws Exception\r\n\t *             bei Fehler.\r\n\t *\/\r\n\tpublic static void main(String[] args) throws Exception {\r\n\r\n\t\t\/\/ laden einer Html Seite \u00fcber eine URL\r\n\t\tDocument doc = Jsoup.connect(\"http:\/\/reise.wenzlaff.de\/reisetabelle\/\").get();\r\n\r\n\t\t\/\/ den Titel ausgeben\r\n\t\tSystem.out.println(\"Der Titel der Website: \" + doc.title());\r\n\r\n\t\t\/\/ die ganze Seite als Html\r\n\t\tSystem.out.println(\"Wir geben mal die ganze Seite als Html aus:\" + doc.html());\r\n\r\n\t\t\/\/ nur die Tabelle selektieren und als Html ausgeben\r\n\t\tElements reiseTabelle = doc.select(\"#tablepress-12\");\r\n\t\tSystem.out.println(\"Die ganze Reisetabelle als HTML: \" + reiseTabelle);\r\n\r\n\t\t\/\/ nur die KM selektieren und in einer Zeile\r\n\t\t\/\/ getrennt durch leerzeichen ausgeben\r\n\t\tElements alleKmAusTabelle = doc.select(\".column-6\");\r\n\t\tSystem.out.println(\"Alle km aus der Tabelle in einer Zeile: \" + alleKmAusTabelle.text());\r\n\r\n\t\t\/\/ und alle L\u00e4nder ohne Html Tags ausgeben\r\n\t\tElements alleLaenderAusTabelle = doc.select(\".column-2\");\r\n\t\tSystem.out.println(\"Alle L\u00e4nder aus der Tabelle ohne HTML Tags: \" + alleLaenderAusTabelle.html());\r\n\t}\r\n}\r\n<\/pre>\n<p>Das Ergebnis wenn dieses Beispielprogramm ausgef\u00fchrt wird, ua.<\/p>\n<pre class=\"lang:default decode:true \" >\r\nAlle L\u00e4nder aus der Tabelle ohne HTML Tags: Land, Ort\r\nEngland, London\r\nFrankreich, Paris\r\nSpanien, Mallorca, Cala Rajada\r\nSpanien, Teneriffa\r\nTunesien, Tunis\r\nGriechenland, Kreta, Heraklion\r\nT\u00fcrkei, Antalya\r\nItalien, Rom\r\nMalediven, Male\r\n\u00c4gypten, Kairo\r\nChina, Hong Kong, Kowloon\r\nNiederland, Amsterdam\r\nDominikanische Republik, Santo Domingo\r\nPortugal, Algarve Albuferia\r\nUSA, Florida, Miami\r\nZypern, Limassol (Israel, Jerusalem; \u00c4gypten, Kairo)\r\nUSA, Kalifornien, San Francisco\r\nGriechenland, Athen\r\nIndonesien, Bali (Singapur)\r\nUSA, New York\r\nMalta, Valletta\r\nMauritius, Port Louis\r\nSpanien, Madrid\r\nJapan, Tokio\r\nBulgarien, Varna\r\nDubai, Ras Al-Khaimah\r\nSpanien, Mallorca, Alc\u00fadia\r\nThailand, Pattaya\r\nHawaii, Waikiki-Beach\r\nSeyshellen, Mahe\r\nPolen (Warschau, Danzig, Thorn ...)\r\nSri Lanka, Ceylon\r\nSeyshellen, Mahe\r\nIrland, Dublin\r\nSchweden, Stockholm\r\nEstland, Tallinn\r\nRussland, St.-Petersburg\r\nDaenemark, Kopenhagen\r\nT\u00fcrkei, Side\r\nUSA Karibik (Miami, Fort Lauderdale, Aruba, Curacao, Grenada, Barbados, St. Lucia, Antigua, St. Maarten, St. Thomas)\r\nItalien, Sizilien (Catania, Taormina, Etna)\r\nVietnam, Saigon (Ho-Chi-Minh-Stadt) *\r\nKambodscha, Phnom Penh *\r\nThailand, Bangkok *\r\nUSA, Kalifornien, San Francisco * (nur Hinflug)\r\nUSA, Florida, Miami * (nur R\u00fcckflug)<\/pre>\n<p>Cool, weitere Beispiele sind auf der Homepage von <a href=\"https:\/\/jsoup.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">Jsoup<\/a> und hier zu finden.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Will man schnell und einfach HTML-Dateien parsen bzw. auswerten, geht das mit der sch\u00f6nen JSoup-Api. Hier gibt es eine Mindmap f\u00fcr den schnellen \u00dcberblick. Es sind dann nur zwei Zeilen n\u00f6tig um z.B. den Titel einer Webseite einzulesen: Document doc = Jsoup.connect(&#8222;http:\/\/reise.wenzlaff.de\/reisetabelle\/&#8220;).get(); System.out.println(&#8222;Der Titel der Website: &#8220; + doc.title()); Hier mal ein Zitat aus der &hellip; <\/p>\n<p class=\"link-more\"><a href=\"http:\/\/blog.wenzlaff.de\/?p=7305\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eJava: Parsen von HTML-Dateien mit JSoup 1.9.2 in zwei Java Zeilen\u201c <\/span>weiterlesen<\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[220,4,5,79],"tags":[2613,2596,2594,2588,2633,2628,2604,2605,2641,2631,2583,2619,2629,2617,2621,2579,2638,2597,2627,2630,2587,2592,1722,2600,2577,2591,2601,2602,2625,2593,2586,2599,2580,2609,2620,2616,2590,2582,2643,2598,2606,2581,2578,2614,2640,2608,2612,2589,2639,2642,2603,2595,2626,2636,2632,2634,2635,2624,2622,2623,2637,2584,2618,2610,256,2585,2607,2611,2615],"class_list":["post-7305","post","type-post","status-publish","format-standard","hentry","category-anleitung","category-eclipse","category-java","category-programmierung","tag-alcdia-thailand","tag-algarve-albuferia-usa","tag-amsterdam-dominikanische-republik","tag-antalya-italien","tag-antigua","tag-aruba","tag-athen-indonesien","tag-bali-singapur-usa","tag-bangkok-usa","tag-barbados","tag-cala-rajada-spanien","tag-ceylon-seyshellen","tag-curacao","tag-danzig","tag-dublin-schweden","tag-england","tag-etna-vietnam","tag-florida","tag-fort-lauderdale","tag-grenada","tag-heraklion-tuerkei","tag-hong-kong","tag-html","tag-jerusalem-aegypten","tag-jsoup","tag-kairo-china","tag-kairo-usa","tag-kalifornien","tag-kopenhagen-tuerkei","tag-kowloon-niederland","tag-kreta","tag-limassol-israel","tag-london-frankreich","tag-madrid-japan","tag-mahe-irland","tag-mahe-polen-warschau","tag-male-aegypten","tag-mallorca","tag-miami-nur-rueckflug","tag-miami-zypern","tag-new-york-malta","tag-paris-spanien","tag-parser","tag-pattaya-hawaii","tag-phnom-penh-thailand","tag-port-louis-spanien","tag-ras-al-khaimah-spanien","tag-rom-malediven","tag-saigon-ho-chi-minh-stadt-kambodscha","tag-san-francisco-nur-hinflug-usa","tag-san-francisco-griechenland","tag-santo-domingo-portugal","tag-side-usa-karibik-miami","tag-sizilien-catania","tag-st-lucia","tag-st-maarten","tag-st-thomas-italien","tag-st-petersburg-daenemark","tag-stockholm-estland","tag-tallinn-russland","tag-taormina","tag-teneriffa-tunesien","tag-thorn-sri-lanka","tag-tokio-bulgarien","tag-tool","tag-tunis-griechenland","tag-valletta-mauritius","tag-varna-dubai","tag-waikiki-beach-seyshellen"],"_links":{"self":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts\/7305","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=7305"}],"version-history":[{"count":0,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts\/7305\/revisions"}],"wp:attachment":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=7305"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=7305"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=7305"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}