2017-04-23 2 views
0

Je joue avec nutch. J'essaye d'écrire quelque chose qui inclut également la détection des noeuds spécifiques dans la structure de DOM et l'extraction des données de texte autour du noeud. par exemple. le texte des noeuds parents, des noeuds frères etc. J'ai recherché et lu quelques exemples et ai alors essayé d'écrire un plugin qui fera ceci pour un noeud d'image. Une partie du code,Comment obtenir le texte environnant d'un noeud?

if("img".equalsIgnoreCase(nodeName) && nodeType == Node.ELEMENT_NODE){ 
      String imageUrl = "No Url"; 
      String altText = "No Text"; 
      String imageName = "No Image Name"; //For the sake of simpler code, default values set to 
               //avoid nullpointerException in findMatches method 

      NamedNodeMap attributes = currentNode.getAttributes(); 
      List<String>ParentNodesText = new ArrayList<String>(); 
      ParentNodesText = getSurroundingText(currentNode); 

      //Analyze the attributes values inside the img node. <img src="xxx" alt="myPic"> 
      for(int i = 0; i < attributes.getLength(); i++){ 
       Attr attr = (Attr)attributes.item(i); 
       if("src".equalsIgnoreCase(attr.getName())){ 
        imageUrl = getImageUrl(base, attr); 
        imageName = getImageName(imageUrl); 
       } 
       else if("alt".equalsIgnoreCase(attr.getName())){ 
        altText = attr.getValue().toLowerCase(); 
       } 
      } 

    private List<String> getSurroundingText(Node currentNode){ 

    List<String> SurroundingText = new ArrayList<String>(); 
    while(currentNode != null){ 
     if(currentNode.getNodeType() == Node.TEXT_NODE){ 
      String text = currentNode.getNodeValue().trim(); 
      SurroundingText.add(text.toLowerCase()); 
     } 

     if(currentNode.getPreviousSibling() != null && currentNode.getPreviousSibling().getNodeType() == Node.TEXT_NODE){ 
      String text = currentNode.getPreviousSibling().getNodeValue().trim(); 
      SurroundingText.add(text.toLowerCase()); 
     } 
     currentNode = currentNode.getParentNode(); 
    } 
    return SurroundingText; 
} 

Cela ne semble pas fonctionner correctement. La balise img est détectée, le nom de l'image et l'URL sont récupérés mais plus d'aide. le module getSurroundingText a l'air trop moche, j'ai essayé mais je n'ai pas pu l'améliorer. Je n'ai pas d'idée claire d'où et comment puis-je extraire du texte qui pourrait être lié à l'image. Toute aide s'il vous plaît?

Répondre

1

vous êtes sur la bonne voie, d'autre part, jetez un oeil à cet exemple HTML de code:

<div> 
    <span>test1</span> 
    <img src="http://example.com" alt="test image" title="awesome title"> 
    <span>test2</span> 
</div> 

Dans votre cas, je pense que le problème réside dans les nœuds frères du img nœud, par exemple vous cherchez les frères directs, et vous pouvez penser que dans l'exemple précédent, ce sont les nœuds span, mais dans ce cas, il y a des nœuds de texte fictifs, donc quand vous demandez le nœud frère du img vous obtiendrez ce noeud vide sans texte réel.

Si nous réécrivons le code HTML précédent comme suit: <div><span>test1</span><img src="http://example.com" alt="test image" title="awesome title"><span>test2</span></div>, les nœuds frères du img correspondent aux nœuds span que vous souhaitez.

Je suppose que dans l'exemple précédent vous voulez obtenir à la fois "text1" et "text2", dans ce cas vous devez réellement continuer à bouger jusqu'à trouver Node.ELEMENT_NODE puis récupérer le texte à l'intérieur de ce nœud. Une bonne pratique serait de ne pas saisir tout ce que vous trouvez, mais limiter votre portée à p, span, div pour améliorer la précision.