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

Trädvy Permalänk
Medlem
Plats
Gävle
Registrerad
Sep 2005

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.

Trädvy Permalänk
Hedersmedlem
Plats
Linköping
Registrerad
Okt 2006

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.

Trädvy Permalänk
Medlem
Plats
Gävle
Registrerad
Sep 2005

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(); } } }

Trädvy Permalänk
Medlem
Plats
Vid datorn
Registrerad
Aug 2006
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")

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 || EVGA NVIDIA GTX 1080 8GB @ 2,0Ghz || Bifenix Prodigy M || 2x CZ TR150 480GB RAID 0 || EK-CoolStream PE 120 & 240, Radiatorer || EK-DDC 3.2 PWM, Pump || EK-Supremacy MX & EK-FC1080 GTX, Vattenblock || 3x BenQ 24", Skärmar