web-dev-qa-db-ja.com

Webページからリンクを抽出する

Javaを使用して、特定のWebページからすべてのリンクを抽出するにはどうすればよいですか?

19
Wassim AZIRAR

ダウンロードJavaプレーンテキスト/ htmlとしてファイルを渡す Jsoup またはhtmlクリーナーの両方を通過させるは似ており、不正なhtml 4.0構文の解析にも使用できます。次に、getElementsByName( "a")などの人気のあるHTML DOM解析メソッドを使用するか、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();

そして、すべてのリンクを見つけて、次を使用して詳細を取得します

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/

17

正規表現と適切なクラスを使用するか、HTMLパーサーを使用します。どちらを使用するかは、Web全体を処理できるようにするか、レイアウトがわかっていてテストできる特定のページだけを処理できるようにするかによって異なります。

ページの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)でテキスト部分にアクセスします

6
dtech

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
shams

この単純な例は機能するようです ここから正規表現を使用

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 URLでも正常に動作します。

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;
    }
}
2
Brad Parks
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
            }
        }
    }
}
2
jfabrizio

おそらく、HTMLリンクタグ<a href=>および</a>で正規表現を使用する必要があります。

1
MattLBeck