我想使用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;
}
}
答案 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中删除空字符串""
。