6 Domanda: Estrai i link da una pagina web

domanda creata a Wed, Nov 19, 2014 12:00 AM

Usando Java, come posso estrarre tutti i link da una determinata pagina web?

    
18
  1. Stai cercando tag di ancoraggio, URL citati o qualsiasi URL anche se si presenta in testo semplice?
    2011-02-25 17: 25: 12Z
6 risposte                              6                         

scarica il file java come testo normale /html passa attraverso Jsoup o html cleaner sono entrambi simili e possono essere usati per analizzare anche la sintassi html 4.0 malformata e quindi puoi usare i popolari metodi di analisi DOM HTML come getElementsByName ("a") o in jsoup è ancora più interessante puoi semplicemente usare

 
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();

e trova tutti i link e poi ottieni i detials usando

 
String linkhref=links.attr("href");

Tratto da http://jsoup.org/cookbook/extracting-data/selector-syntax

I selettori hanno la stessa sintassi del jQuery se conosci il concatenamento delle funzioni di jQuery, quindi ti piacerà sicuramente.

EDIT: nel caso tu voglia più tutorial, puoi provare questo fatto da mkyong.

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

    
17
2015-03-27 06: 55: 07Z
  1. Grazie! Funziona.
    2013-12-02 01: 44: 20Z

Utilizzare un'espressione regolare e le classi appropriate o utilizzare un parser HTML. Quale vuoi utilizzare dipende se vuoi essere in grado di gestire l'intero web o solo alcune pagine specifiche di cui conosci il layout e che puoi testare.

Una semplice regex che corrisponda al 99% delle pagine potrebbe essere questa:

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

Puoi modificarlo per abbinarlo di più, essere più conforme allo standard ecc. ma in questo caso vorrai un parser reale. Se sei interessato solo a href = "" e al testo in mezzo puoi anche usare questa espressione regolare:

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

E accedi alla parte del link con .group(1) e alla parte di testo con .group(2)

    
6
2015-04-26 20: 01: 46Z
  1. Penso che tu abbia mentito ... href = [\"']? ([^ \"'] +) ... '. Ma poi di nuovo .. che cosa se href = "blablalba /Mc'Chicken". La stringa non verrà tagliata nel momento in cui raggiunge la citazione singola?
    2012-09-30 13: 54: 08Z
  2. GUARDA IL COMMENTO PRECEDENTE!
    2018-09-20 11: 27: 31Z

Puoi utilizzare la parser HTML per ottenere questo risultato:

 
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
2014-02-13 22: 08: 11Z
  1. Questo è veramente buono. Puoi ottenere il parser qui: htmlparser.sourceforge.net
    2011-08-31 10: 50: 25Z
  2. @ shams: se l'URL ha un carattere speciale come (www.google-gmail.com) ha ottenuto unn eccezione "org.htmlparser.util.EncodingChangeException: mancata corrispondenza dei caratteri (nuovo:? [0xfeff]! = vecchio: [0xefï]) per la modifica della codifica da ISO-8859-1 a UTF-8 con offset di carattere 0" come risolvere questo
    2014-11-05 09: 09: 02Z

Questo semplice esempio sembra funzionare, utilizzando una regex da qui

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

e se ne hai bisogno, sembra che funzioni anche per ottenere l'HTML di un url, restituendo null se non può essere afferrato. Funziona bene anche con gli 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;
    }
}
    
2
2017-05-23 11: 54: 41Z
  1. C'è un modo per limitarlo a tutti i link all'interno di una tabella con un valore id specificato?
    2017-05-10 08: 51: 52Z
  2. @ santafebound - Questo non potrebbe davvero farlo - avresti bisogno di usa qualcosa come jsoup per farlo penso.
    2017-05-10 13: 22: 20Z
 
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
2016-10-05 23: 16: 27Z
  1. Aggiunta di importazioni necessarie: (Se si utilizza il terminale e non si conoscono le importazioni) importare java.io. *; importa java.net. *;
    21-10-2015 21: 41: 27Z

Probabilmente dovresti usare le espressioni regolari sui tag di link HTML <a href=> e </a>

    
1
2011-02-25 17: 01: 22Z
  1. Chiunque pensi di seguire questo percorso dovrebbe leggere questo post: stackoverflow.com/questions/590747/...
    2011-06-10 22: 52: 06Z
fonte posta Qui