Java, spara del av site till variabel genom att använda URL+Scanner?

Permalänk

Java, spara del av site till variabel genom att använda URL+Scanner?

Jag försöker komma på hur jag ska lösa en uppgift där jag ska spara en del av en enkel site till en variabel genom att använda URL och Scanner hasNext.. eller liknande. Min plan var att läsa in hela sidan med URL(url) och använda scanner. openStream med regex på något sätt för att hitta den första texten som står mellan två <p></p>

Men hur går jag tillväga för att göra detta? Detta är en nybörjaruppgift så jag behöver inte ha ett jätte avancerat eller effektivt sätt för att lösa detta då det är mest för att lära mig grunderna.

Permalänk
Hedersmedlem

Brukar alltid vara ett kul svar att läsa när någon nämner regex och HTML.

http://stackoverflow.com/questions/1732348/regex-match-open-t...

Som vissa däremot säger kan man i vissa begränsade fall göra det. Beroende på hur HTML-koden ser ut kanske det går.

Tyvärr vet jag inte hur det annars sköts. Mycket manuell parsning kanske.

Permalänk

Har suttit å klurat ett tag nu men får inte till det riktigt. Vad är det för fel på denna kod?

public static void main(String[] args) throws IOException { BufferedReader br = null; try { URL url = new URL("http://www.eduro.com"); br = new BufferedReader(new InputStreamReader(url.openStream())); String line; StringBuilder sb = new StringBuilder(); while ((line = br.readLine()) != null) { sb.append(line); sb.append(System.lineSeparator()); } String pattern = "(<p>.*<\\/p>)"; String updated = sb.toString().replaceAll(pattern, "$1"); System.out.println(updated); } finally { if (br != null) { br.close(); } } }

Permalänk
Medlem
Skrivet av burton666:

Har suttit å klurat ett tag nu men får inte till det riktigt. Vad är det för fel på denna kod?

public static void main(String[] args) throws IOException { BufferedReader br = null; try { URL url = new URL("http://www.eduro.com"); br = new BufferedReader(new InputStreamReader(url.openStream())); String line; StringBuilder sb = new StringBuilder(); while ((line = br.readLine()) != null) { sb.append(line); sb.append(System.lineSeparator()); } String pattern = "(<p>.*<\\/p>)"; String updated = sb.toString().replaceAll(pattern, "$1"); System.out.println(updated); } finally { if (br != null) { br.close(); } } }

Det som blir fel är att det regex inte matchar korrekt för inputen.
Det finns fler </p> taggar än <p> taggar då vissa <p> taggar inte är kompletta (ta <p class="author"> till exempel).
Detta gör att du får göra ett komplett regex som allid matchar alla typer av <p> taggar.
Vill du labba med detta kan du förslagsvis använda ett verktyg för regex i java, t.ex.
http://www.regexplanet.com/advanced/java/index.html
Där skriver du in ditt regex, input samt bockarför javaspecifika paramterar.

En ännu bättre lösning är att använda ett query biblotek för html t.ex. Jerry http://jodd.org/doc/jerry/
Du kan då hämta ut alla <p> taggar genom att skriva något i stil med Jerry.jerry(html).("p")

Visa signatur

In the end what separates a man from a slave?
Money? Power? No... A man chooses, a slave obeys.
ASUS Z170M-PLUS || Intel Core i7 6700k @ 4,7GHz || 64GB 2133MHz Corsair RAM || MSI NVIDIA RTX 2070 Gaming Z 8GB || Bifenix Prodigy M || 2x CZ TR150 480GB RAID 0 || BeQuiet DarkRock Pro