2016-07-28 8 views
0

Ich möchte einige HTML-Daten aus der Seitenquelle extrahieren. Hier ist der Hinweis. Link haben einen HTML-Link view-source: http://www.4icu.org/reviews/index2.htm. Ich möchte fragen, wie ich nur den Namen der Universität und den Ländernamen mit JAVA extrahieren könnte. Ich kenne den Weg, um einfach den Namen der Universität zu extrahieren, aber wie kann ich das Programm schneller machen, indem ich einfach die Tabelle scanne, wenn class = "i", und auch das Land, zB USA, mit der < ... alt = "Vereinigte Staaten" />JAVA Parsing-Tabelle Daten

<tr> 
<td><a name="UNIVERSITIES-BY-NAME"></a><h2>A-Z list of world Universities and Colleges</h2> 
</tr> 

<tr> 
<td class="i"><a href="/reviews/9107.htm"> A.T. Still University</a></td> 
<td width="50" align="right" nowrap>us <img src="/i/bg.gif" class="fl flag-us" alt="United States" /></td> 
</tr> 

Vielen Dank im Voraus.

EDIT Nach was @ 11thdimension ist

meine .java-Datei hier gesagt hat
public class University { 
    public static void main(String[] args) throws Exception { 
     System.out.println("Started"); 

     URL url = new URL ("http://www.4icu.org/reviews/index2.htm"); 

     URLConnection spoof = url.openConnection();   
     // Spoof the connection so we look like a web browser 
     spoof.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0; H010818)"); 

     String connect = url.toString(); 
     Document doc = Jsoup.connect(connect).get(); 

     Elements cells = doc.select("td.i"); 

     Iterator<Element> iterator = cells.iterator(); 

     while (iterator.hasNext()) { 
      Element cell = iterator.next(); 
      String university = cell.select("a").text(); 
      String country = cell.nextElementSibling().select("img").attr("alt"); 

      System.out.printf("country : %s, university : %s %n", country, university); 
     } 
    } 
} 

Allerdings, wenn ich es laufen, es mir die folgende Fehlermeldung gibt.

Started 
Exception in thread "main" org.jsoup.HttpStatusException: HTTP error fetching URL. Status=403, URL=http://www.4icu.org/reviews/index2.htm 

EDIT2 ich das folgende Programm erstellt haben, den Header der HTML-Seite zu bekommen.

public class Get_Header { 
    public static void main(String[] args) throws Exception { 
    URL url = new URL("http://www.4icu.org/reviews/index2.htm"); 
    URLConnection connection = url.openConnection(); 

    Map responseMap = connection.getHeaderFields(); 
    for (Iterator iterator = responseMap.keySet().iterator(); iterator.hasNext();) { 
     String key = (String) iterator.next(); 
     System.out.println(key + " = "); 

     List values = (List) responseMap.get(key); 
     for (int i = 0; i < values.size(); i++) { 
     Object o = values.get(i); 
     System.out.println(o + ", "); 
     } 
    } 
    } 
} 

Es wiederholt das folgende Ergebnis.

X-Frame-Options = 
SAMEORIGIN, 
Transfer-Encoding = 
chunked, 
null = 
HTTP/1.1 403 Forbidden, 
CF-RAY = 
2ca61c7a769b1980-HKG, 
Server = 
cloudflare-nginx, 
Cache-Control = 
max-age=10, 
Connection = 
keep-alive, 
Set-Cookie = 
__cfduid=d4f8d740e0ae0dd551be15e031359844d1469853403; expires=Sun, 30-Jul-17 04:36:43 GMT; path=/; domain=.4icu.org; HttpOnly, 
Expires = 
Sat, 30 Jul 2016 04:36:53 GMT, 
Date = 
Sat, 30 Jul 2016 04:36:43 GMT, 
Content-Type = 
text/html; charset=UTF-8, 

Obwohl ich den Header bekommen kann, aber wie sollte ich den Code in EDIT und EDIT2 zu einem vollständigen kombinieren? Vielen Dank.

+0

Sie es brauchen Sie einmal zu tun oder würde es sein, sich wiederholende tas k? – 11thdimension

+0

Wie lange sollte die Lösung es rechtfertigen, die Frage auf Eis zu legen? – 11thdimension

+0

Ich habe die Frage bearbeitet, um mein Problem einzugrenzen. Danke –

Antwort

1

Wenn es eine einmalige Aufgabe ist, dann sollten Sie wahrscheinlich Javascript dafür verwenden.

Der folgende Code protokolliert die erforderlichen Namen in der Konsole. Sie müssen es in der Browserkonsole ausführen.

(function() { 
    var a = []; 
    document.querySelectorAll("td.i a").forEach(function (anchor) { a.push(anchor.textContent.trim());}); 

    console.log(a.join("\n")); 
})(); 

folgt ein Java-Beispiel mit Jsoup selectors

Maven Dependency

<dependencies> 
    <dependency> 
     <groupId>org.jsoup</groupId> 
     <artifactId>jsoup</artifactId> 
     <version>1.8.3</version> 
    </dependency> 
</dependencies> 

Java-Code

import java.io.File; 
import java.util.Iterator; 

import org.jsoup.Jsoup; 
import org.jsoup.nodes.Document; 
import org.jsoup.nodes.Element; 
import org.jsoup.select.Elements; 

public class TestJsoup { 
    public static void main(String[] args) throws Exception { 
     System.out.println("Starteed"); 

     File file = new File("A-Z list of 11930 World Colleges & Universities.html"); 
     Document doc = Jsoup.parse(file, "UTF-8"); 

     Elements cells = doc.select("td.i"); 

     Iterator<Element> iterator = cells.iterator(); 

     while (iterator.hasNext()) { 
      Element cell = iterator.next(); 
      String university = cell.select("a").text(); 
      String country = cell.nextElementSibling().select("img").attr("alt"); 

      System.out.printf("country : %s, university : %s %n", country, university); 
     } 
    } 
} 
+0

Danke. Das Programm wird mehrmals ausgeführt, da verschiedene Indexnummern im http-Link geändert werden müssen. Einfach nur neugierig, wie ich mit java nur die land nane daten in den "alt = vereinigten staaten" packen kann. Danke –

+0

Code hinzugefügt, um Land zu extrahieren. – 11thdimension

+0

Danke für Hilfe. Jedoch, wenn ich den Link http://www.4icu.org/reviews/index2.htm an den Ort in der AZ-Liste von 11930 World Colleges & Universities.html einfüge, gibt es eine Ausnahme im Thread "main" java. io.FileNotFoundException: www.4icu.org \ reviews \ index2.htm Ich habe meine Frage geändert, um es klarer zu machen. –