从网页中提取链接

使用Java,我如何从给定的网页中提取所有链接?

下载java文件作为纯文本/ html传递它通过Jsoup或html清理器两者是相似的,可用于解析甚至格式错误的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(); 

并找到所有链接,然后使用detials

 String 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/

使用正则表达式和相应的类或使用HTML解析器。 您要使用哪一个取决于您是希望能够处理整个网络还是只能处理您知道布局以及可以测试的几个特定页面。

一个匹配99%页面的简单正则表达式可能是这样的:

 // The HTML page as a String String HTMLPage; Pattern linkPattern = Pattern.compile("(]+>.+?<\/a>)", Pattern.CASE_INSENSITIVE|Pattern.DOTALL); Matcher pageMatcher = linkPattern.matcher(HTMLPage); ArrayList links = new ArrayList(); while(pageMatcher.find()){ links.add(pageMatcher.group()); } // links ArrayList now contains all links in the page as a HTML tag // ie Text inside tag 

你可以编辑它以匹配更多,更符合标准等等,但在这种情况下你需要一个真正的解析器。 如果你只对href =“”及其间的文字感兴趣,你也可以使用这个正则表达式:

 Pattern linkPattern = Pattern.compile("]+href=[\"']?([\"'>]+)[\"']?[^>]*>(.+?)<\/a>", Pattern.CASE_INSENSITIVE|Pattern.DOTALL); 

并使用.group(1)访问链接部分,使用.group(1)访问文本部分

您可以使用HTML Parser库来实现此目的:

 public static List getLinksOnPage(final String url) { final Parser htmlParser = new Parser(url); final List result = new LinkedList(); 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; } 

这个简单的例子似乎有效, 使用了这里的正则表达式

 import java.util.regex.Matcher; import java.util.regex.Pattern; public ArrayList extractUrlsFromString(String content) { ArrayList result = new ArrayList(); 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。 它也适用于httpsurl。

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

您可能需要在的HTML链接标记上使用正则表达式