java - 如何获取节点周围的文本?

标签 java search text nutch dom-node

我正在玩弄坚果。我正在尝试编写一些内容,其中还包括检测 DOM 结构中的特定节点并从节点周围提取文本数据。例如来自父节点、兄弟节点等的文本。我研究并阅读了一些示例,然后尝试编写一个插件来为图像节点执行此操作。部分代码,

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

这似乎不能正常工作。检测到 img 标签,检索图像名称和 URL,但没有更多帮助。 getSurroundingText 模块看起来太丑了,我尝试过但无法改进它。我不清楚从哪里以及如何提取可能与图像相关的文本。请问有什么帮助吗?

最佳答案

您的思路是正确的,但另一方面,请查看以下示例 HTML 代码:

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

就你的情况而言,我认为问题出在 img 的兄弟节点上。节点,例如您正在寻找直接兄弟节点,您可能认为在前面的示例中这些将是 span节点,但在本例中是一些虚拟文本节点,因此当您询问 img 的同级节点时你会得到这个空节点,没有实际的文本。

如果我们将之前的 HTML 重写为:<div><span>test1</span><img src="http://example.com" alt="test image" title="awesome title"><span>test2</span></div>那么 img 的兄弟节点将是 span您想要的节点。

我假设在前面的示例中您想要同时获取“text1”和“text2”,在这种情况下,您实际上需要继续移动,直到找到一些 Node.ELEMENT_NODE然后获取该节点内的文本。一种好的做法是不要抓取您找到的任何内容,而是将范围限制在 p 范围内。 , span , div提高准确率。

关于java - 如何获取节点周围的文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43575817/

相关文章:

Javamail IMAP OAUTH2/SASL 异常

java - 在二叉树中查找最大元素

python - 列表是否有简短的包含功能?

python - 如何让我的数独解算器从 python 中的文本文件中读取?

html - 如何在连字符 (-) 等特殊字符后打断单词

java - 如何突出显示 JLabel 的一部分?

java - 任务不可序列化错误 - Spark Java

java - 文本文件格式错误检查

java - 继承和泛型

excel - 使用跨多列的搜索功能