使用JAVA从HTML WebPage中的META标记中检索KEYWORDS

时间:2011-02-23 22:33:02

标签: java html collections meta-tags

我想使用Java检索HTML WebPage中的所有内容词以及同一HTML网页的META TAG中包含的所有关键词。
例如,考虑这个html源代码:

<html>
<head>
<meta name = "keywords" content = "deception, intricacy, treachery">
</head>
<body>
My very short html document. 
<br>
It has just 2 'lines'.
</body>
</html>

这里的内容是:我的非常简短 html 文件< / em>, it 只是

注意:标点符号和数字'2'被排除在外。

这里的关键词是:欺骗错综复杂背叛

我为此创建了一个名为WebDoc的类,这是我能够获得的。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.Set;
import java.util.TreeSet;

public class WebDoc {

    protected URL _url;
    protected Set<String> _contentWords;
    protected Set<String> _keyWords

    public WebDoc(URL paramURL) {
        _url = paramURL;
    }

    public Set<String> getContents() throws IOException {
        //URL url = new URL(url);
        Set<String> contentWords = new TreeSet<String>();
        BufferedReader in = new BufferedReader(new InputStreamReader(_url.openStream()));
        String inputLine;

        while ((inputLine = in.readLine()) != null) {
            // Process each line.
            contentWords.add(RemoveTag(inputLine));
            //System.out.println(RemoveTag(inputLine));
        }
        in.close();
        System.out.println(contentWords);
        _contentWords = contentWords;
        return contentWords;
    }    

    public String RemoveTag(String html) {
        html = html.replaceAll("\\<.*?>","");
        html = html.replaceAll("&","");
        return html;
    }



    public Set<String> getKeywords() {
        //NO IDEA !
        return null;
    }

    public URL getURL() {
        return _url;
    }

    @Override
    public String toString() {
        return null;
    }
}

2 个答案:

答案 0 :(得分:1)

处理每一行并使用

public Set<String> getKeywords(String str) {
        Set<String> s = new HashSet<String>();
        str = str.trim();
        if (str.toLowerCase().startsWith("<meta ")) {
           if (str.toLowerCase().matches("<meta name\\s?=\\s?\"keywords\"\\scontent\\s?=\\s?\".*\"/?>")) {
               // Returns only whats in the content attribute (case-insensitive)
               str = str.replaceAll("(?i)<meta name\\s?=\\s?\"keywords\"\\scontent\\s?=\\s?\"(.*)\"/?>","$1");
               for (String st:str.split(",")) s.add(st.trim());
               return s;
           }
        }
        return null;
    }

如果您需要解释,请告诉我。

答案 1 :(得分:1)

因此,在RedSoxFan关于元关键字的答案之后,您只需要拆分内容行。 你可以在那里使用类似的方法:

而不是

contentWords.add(RemoveTag(inputLine));

使用

contentWords.addAll(Arrays.asList(RemoveTag(inputLine).split("[^\\p{L}]+")));
  • .split(...)将你的行拆分为所有非字母(我希望这有效,请尝试报告),给出一个子串数组,每个子串应该只包含字母,以及一些空字符串。< / LI>
  • Arrays.asList(...)将此数组包装在列表中。
  • addAll(...)将此数组的所有元素添加到集合中,但不重复。)

最后,您应该从contentWords-Set中删除空字符串""