# Html tabelle auslesen???



## 1991macl (4. Jan 2012)

Ich möchte aus einer Internetseite eine Tabelle auslesen, z.B. Wikipedia...
Habe das bislang so:


```
import org.w3c.tidy.Tidy;
import org.w3c.dom.Node;
import org.w3c.dom.NamedNodeMap;
import java.net.URL;
import java.util.ArrayList;
 
public class Erste{
    public static void printSelectedTags(Node parent, String ... selectedTags){
        for(int i = 0; i < selectedTags.length; i++){
            if(parent.getNodeName().equals(selectedTags[i])){
                NamedNodeMap nmap = parent.getAttributes();
                System.out.print("<" + parent.getNodeName());
                for(int j = 0; j < nmap.getLength(); j++)
                    System.out.print(" " + nmap.item(j).getNodeName() + "=\"" + nmap.item(j).getNodeValue() + "\"");
                System.out.println(">");
            }
        }
 
        for(int i = 0; i < parent.getChildNodes().getLength(); i++)
            printSelectedTags(parent.getChildNodes().item(i), selectedTags);
    }
    
    public static void main(String[] args) throws Exception{
        Tidy t = new Tidy();
        t.setXmlTags(true);
        URL url = new URL("http://de.wikipedia.org/wiki/Deutschland");
        Node rootElement = t.parseDOM(url.openConnection().getInputStream(), null);
        printSelectedTags(rootElement, "tr", "td");
    }
}
```


Allerdings möchte ich nicht die Informationen von <td style="...".....> sonder dass was zwischen <td style="..."> und </td> steht, also sozusagen den Tabelleninhalt.

Als Beispiel(Wikipedia Deutschland-Artikel):


```
<td style="background-color:#f2f2f4; font-size:90%;" valign="top"><b><a href="/wiki/Hauptstadt" title="Hauptstadt">Hauptstadt</a></b></td>
<td style="font-size:90%;"><a href="/wiki/Berlin" title="Berlin">Berlin</a></td>
```
)

Da möchte ich nur Hauptstadt und Berlin haben...

Hoffe ich habe es einigermaßen gut erklärt...


----------



## 1991macl (12. Jan 2012)

Ist es generell nicht möglich oder weiß keiner wie?


----------



## Final_Striker (12. Jan 2012)

Da wirst du wohl mit RegEx Ausdrücken arbeiten müssen und so die für dich benötigten Sachen rauszuparsen.

z.B. könntest du alles zwischen 
	
	
	
	





```
<td
```
 und nächstem 
	
	
	
	





```
>
```
 einfach rauslöschen.


----------



## nillehammer (12. Jan 2012)

Du arbeitest ja schon mit Tidy und w3c-Nodes. Node gibt Dir alles, was Du brauchst. Du musst anhand des Nodetypes verzweigen. Wenn Du bspw. den Text zwischen den tds haben willst, ist die Konstante TEXT_NODE Dein Freund.
Infos gibts hier: Node (Java 2 Platform SE 5.0)


----------



## 1991macl (12. Jan 2012)

Habe mich jetzt schon ein bisschen damit versucht, es aber noch nicht hinbekommen...
Bin ich aber richtig, dass ich die Methode getTextContent() brauche?
Vielleicht kannst du mir noch ein bisschen mehr helfen, nillehammer?

Aber danke schon mal für eure Beiträge!!!


----------



## nillehammer (13. Jan 2012)

Hier mal Code für Dich zum Nachvollziehen, wie man in einen Baum hinabsteigt und abhängig von Nodetypes verzweigt. Der Code ist nicht 100% durchgetestet. Kann also sein, dass kliene logische Fehler drinnen sind. Außerdem könnte es auch sinnvoll sein, an geeigneter Stelle von Node auf Element zu casten, weil es sich damit evtl. bequemer arbeiten lässt.

```
private static final String TD = "td";
...
// Den root node hast Du schon in der Variablen rootElement (siehe Dein eigener Code)
final NodeList rootChildren = rootElement.getChildNodes();

findTds(rootChildren);

/**
  * Steigt einen Baum von tags hinab. Sobald ein td-Tag gefunden wurde, 
  * wird dieser zur besonderen Behandlung an eine weitere Methode übergeben
  */
private static void findTds(final NodeList nodeList) {

  for(int i = 0; i<nodeList.getLength(); i++) {
 
    final Node current = nodeList.item(i);

    if( current.getNodeType() != Node.ELEMENT_NODE) { 
      // Wir haben irgendwas anderes als einen Tag. Interessiert uns nicht.
      // Nix machen und zum nächsten Child weiter...
      continue;
    }

    if ( TD.equalsIgnoreCase(current.getNodeValue()) ) {
      // Wir haben einen td gefunden.
      printTextContentOfTd(current);
    }
    
    // rekursiver Aufruf, um weiter in den Baum hinabzusteigen
    findTds(current);
  }

}

/**
  * Geht die Liste der Kinder eines (td-)Nodes durch. Bei allen Textknoten
  * wird der Text auf der Konsole ausgegeben.
  */
private static void printTextContentOfTd(final Node tdNode) {

   final NodeList children = tdNode.getChildNodes();
 
   for( int i = 0; i< children.getLenght(); i++ ) {
     final Node current = children.item(i);
     if (current.getNodeType == Node.TEXT_NODE) {
       System.out.println(current.getNodeValue();
     }
   }
}
}
```


----------



## 1991macl (16. Jan 2012)

Habe das Wochenende rumprobiert, es allerdings immer noch nicht hinbekommen... 
Könntest du mir einen funktionierenden Quellcode schicken?
Ich weiß dass ich es eigentlich selber machen sollte, bekomme es wie gesagt aber nicht hin...


----------

