Подтвердить что ты не робот

Извлечение ссылок с веб-страницы

Использование Java, как я могу извлечь все ссылки с данной веб-страницы?

4b9b3361

Ответ 1

загрузить 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, тогда вам это обязательно понравится.

EDIT: если вы хотите больше учебных пособий, вы можете попробовать это, сделанное mkyong.

http://www.mkyong.com/java/jsoup-html-parser-hello-world-examples/

Ответ 2

Используйте либо регулярное выражение, и соответствующие классы, либо используйте парсер 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)

Ответ 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;
}

Ответ 4

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

Ответ 5

Этот простой пример работает с использованием регулярного выражения здесь

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

и если вам это нужно, это, похоже, работает, чтобы получить HTML-код url, возвращая null, если его невозможно захватить. Он отлично работает с URL-адресами 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;
    }
}

Ответ 6

Вам, вероятно, придется использовать регулярные выражения для тегов ссылок HTML <a href=> и </a>