Javaを使用して、特定のWebページからすべてのリンクを抽出するにはどうすればよいですか?
ダウンロード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/
正規表現と適切なクラスを使用するか、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)
でテキスト部分にアクセスします
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;
}
この単純な例は機能するようです ここから正規表現を使用
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;
}
}
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リンクタグ<a href=>
および</a>
で正規表現を使用する必要があります。