使用Java,我如何从给定的网页中提取所有链接?
答案 0 :(得分:17)
下载java文件作为纯文本/ html传递通过Jsoup或 html cleaner 两者都相似,可用于解析格式错误的html 4.0语法然后你可以使用流行的HTML DOM解析方法,如getElementsByName(“a”)或jsoup甚至很酷,你可以简单地使用
File input = new File("/tmp/input.html");
Document doc = Jsoup.parse(input, "UTF-8", "http://example.com/");
Elements links = doc.select("a[href]"); // a with href
Elements pngs = doc.select("img[src$=.png]");
// img with src ending .png
Element masthead = doc.select("div.masthead").first();
找到所有链接然后使用
获取detialsString linkhref=links.attr("href");
取自http://jsoup.org/cookbook/extracting-data/selector-syntax
如果您知道jQuery函数链接,那么选择器的语法与jQuery
相同,那么您一定会喜欢它。
编辑:如果你想要更多的教程,你可以试试这个由mkyong制作的教程。
http://www.mkyong.com/java/jsoup-html-parser-hello-world-examples/
答案 1 :(得分:6)
使用正则表达式和相应的类或使用HTML解析器。您想要使用哪一个取决于您是希望能够处理整个网络还是仅仅是您知道布局以及可以测试的几个特定页面。
一个匹配99%页面的简单正则表达式可能是这样的:
// The HTML page as a String
String HTMLPage;
Pattern linkPattern = Pattern.compile("(<a[^>]+>.+?<\/a>)", Pattern.CASE_INSENSITIVE|Pattern.DOTALL);
Matcher pageMatcher = linkPattern.matcher(HTMLPage);
ArrayList<String> links = new ArrayList<String>();
while(pageMatcher.find()){
links.add(pageMatcher.group());
}
// links ArrayList now contains all links in the page as a HTML tag
// i.e. <a att1="val1" ...>Text inside tag</a>
你可以编辑它以匹配更多,更符合标准等等,但在这种情况下你需要一个真正的解析器。 如果你只对href =“”及其间的文字感兴趣,你也可以使用这个正则表达式:
Pattern linkPattern = Pattern.compile("<a[^>]+href=[\"']?([\"'>]+)[\"']?[^>]*>(.+?)<\/a>", Pattern.CASE_INSENSITIVE|Pattern.DOTALL);
使用.group(1)
访问链接部分,使用.group(2)
答案 2 :(得分:3)
您可以使用HTML Parser库来实现此目的:
public static List<String> getLinksOnPage(final String url) {
final Parser htmlParser = new Parser(url);
final List<String> result = new LinkedList<String>();
try {
final NodeList tagNodeList = htmlParser.extractAllNodesThatMatch(new NodeClassFilter(LinkTag.class));
for (int j = 0; j < tagNodeList.size(); j++) {
final LinkTag loopLink = (LinkTag) tagNodeList.elementAt(j);
final String loopLinkStr = loopLink.getLink();
result.add(loopLinkStr);
}
} catch (ParserException e) {
e.printStackTrace(); // TODO handle error
}
return result;
}
答案 3 :(得分:2)
import java.io.*;
import java.net.*;
public class NameOfProgram {
public static void main(String[] args) {
URL url;
InputStream is = null;
BufferedReader br;
String line;
try {
url = new URL("http://www.stackoverflow.com");
is = url.openStream(); // throws an IOException
br = new BufferedReader(new InputStreamReader(is));
while ((line = br.readLine()) != null) {
if(line.contains("href="))
System.out.println(line.trim());
}
} catch (MalformedURLException mue) {
mue.printStackTrace();
} catch (IOException ioe) {
ioe.printStackTrace();
} finally {
try {
if (is != null) is.close();
} catch (IOException ioe) {
//exception
}
}
}
}
答案 4 :(得分:2)
这个简单的例子似乎有效,using a regex from here
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public ArrayList<String> extractUrlsFromString(String content)
{
ArrayList<String> result = new ArrayList<String>();
String regex = "(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(content);
while (m.find())
{
result.add(m.group());
}
return result;
}
如果你需要它,这似乎也可以获取url的HTML,如果无法获取则返回null。它也适用于https
网址。
import org.apache.commons.io.IOUtils;
public String getUrlContentsAsString(String urlAsString)
{
try
{
URL url = new URL(urlAsString);
String result = IOUtils.toString(url);
return result;
}
catch (Exception e)
{
return null;
}
}
答案 5 :(得分:1)
您可能需要在HTML链接标记<a href=>
和</a>
上使用正则表达式