2010-02-18 10 views
5

Używam parsera HTML do opracowania aplikacji. Poniższy kod nie jest w stanie uzyskać całego zestawu tagów na stronie. Istnieje kilka znaczników, które są pomijane, a ich atrybuty i treść są pomijane. proszę mi pomóc wyjaśnić, dlaczego tak się dzieje ..... lub zaproponować mi inny sposób ....Jak korzystać z parsera HTML, aby uzyskać pełne informacje o wszystkich znacznikach na stronie HTML?

URL url = new URL("..."); 
PrintWriter pw=new PrintWriter(new FileWriter("HTMLElements.txt")); 

URLConnection connection = url.openConnection(); 
InputStream is = connection.getInputStream(); 
InputStreamReader isr = new InputStreamReader(is); 
BufferedReader br = new BufferedReader(isr); 

HTMLEditorKit htmlKit = new HTMLEditorKit(); 
HTMLDocument htmlDoc = (HTMLDocument)htmlKit.createDefaultDocument(); 
HTMLEditorKit.Parser parser = new ParserDelegator(); 
HTMLEditorKit.ParserCallback callback = htmlDoc.getReader(0); 
parser.parse(br, callback, true); 

ElementIterator iterator = new ElementIterator(htmlDoc); 
Element element; 
    while ((element = iterator.next()) != null) 
    { 
    AttributeSet attributes = element.getAttributes(); 
    Enumeration e=attributes.getAttributeNames(); 

    pw.println("Element Name :"+element.getName()); 
    while(e.hasMoreElements()) 
    { 
     Object key=e.nextElement(); 
     Object val=attributes.getAttribute(key); 
     int startOffset = element.getStartOffset(); 
    int endOffset = element.getEndOffset(); 
    int length = endOffset - startOffset; 
    String text=htmlDoc.getText(startOffset, length); 

     pw.println("Key :"+key.toString()+" Value :"+val.toString()+"\r\n"+"Text :"+text+"\r\n"); 

    } 
    } 

}

+2

Problem jest zbyt ogólny. Zapoznaj się z przykładową witryną (może to być http: // google.com?) I powiedz szczegółowo, czego dokładnie brakuje. – BalusC

+0

w rzeczywistości chcę wyodrębnić informacje takie jak nazwa produktu, cena itp. Wszystkich produktów wymienionych w witrynie zakupów online, takich jak amazon.com Jak powinienem to zrobić ??? –

Odpowiedz

0

Wydawało używać HTMLDocument huśtawka. To może nie być najmądrzejszy pomysł w historii. Uważam, że lepsze wyniki można uzyskać, używając na przykład NekoHtml.

1

Zgodnie komentarzach:

rzeczywiście chcę, aby wydobyć informacje takie jak nazwa produktu, cena itp wszystkich produktów wymienionych w witrynie zakupy online, takich jak amazon.com Jak mam iść na ten temat? ??

Krok 1: odczytania swoich plików robots. Zwykle znajduje się w katalogu głównym witryny, na przykład http://amazon.com/robots.txt. Jeśli adres URL, do którego próbujesz uzyskać dostęp, jest objęty numerem Disallow na User-Agent z *, a następnie zatrzymaj tutaj:. Skontaktuj się z nimi, wyjaśnij szczegółowo, co próbujesz zrobić, i zapytaj ich o sposoby/alternatywy/usługi sieciowe, które mogą dostarczyć potrzebnych informacji. W przeciwnym razie naruszasz prawo i możesz ryzykować, że dostaniesz czarną listę na stronie i/lub przez dostawcę Internetu lub jeszcze gorzej. Jeśli nie, przejdź do kroku 2.

Krok 2: Sprawdź, czy dana strona nie ma jeszcze dostępnego publicznego serwisu, który jest o wiele łatwiejszy w użyciu niż analiza całej strony HTML. Korzystając z usługi internetowej, otrzymasz dokładnie te informacje, których szukasz w zwięzłym formacie (JSON lub XML) w oparciu o prosty zestaw parametrów. Rozejrzyj się lub skontaktuj się z nimi, aby uzyskać szczegółowe informacje na temat usług internetowych. Jeśli nie ma sposobu, przejdź do kroku 3.

Krok 3: nauczyć HTML/CSS/praca JS, aby dowiedzieć się, jak pracować z Webdeveloper narzędzi, takich jak Firebug, aby dowiedzieć się, jak interpretować HTML/CSS/źródło, z którego JS zobacz przez rightclick>Wyświetl źródło strony. Mój zakład, że dana strona używa JS/Ajax do załadowania/wypełnienia informacji, które chcesz zebrać. W takim przypadku będziesz musiał użyć parsera HTML, który potrafi również parsować i wykonywać JS (ten, którego używasz, nie robi tego). To nie będzie łatwa praca, więc nie wyjaśniam jej szczegółowo, dopóki nie będzie całkowicie jasne, co próbujesz osiągnąć i czy jest to dozwolone, i czy nie ma więcej łatwych w użyciu webservices dostępny.

+0

Krok 1: Robots.txt pozwala. Nie jest to problem. Krok 2: Próbowałem używać AWS w tej sprawie, ale nie daje to wyczerpującej listy wszystkich potrzebnych informacji. Ale informacje można zobaczyć na stronie internetowej. Więc muszę rzeczywiście przejść do kroku 3 Krok 3: Teraz problem polega na tym, że muszę wydobyć nazwę produktu, cenę, funkcje. Można to zrobić, jeśli ręcznie określę sposób przechowywania tych informacji na stronie internetowej. Ale teraz chcę sposób, który powinien zautomatyzować ten wzór znalezienie lub powinien być w stanie wyodrębnić go bez żadnego wzoru zostały dostarczone do programu. Jak powinienem to zrobić? Dzięki –

9

Robię to dość rzetelnie z HTML Parser (pod warunkiem, że dokument HTML nie zmienia swojej struktury). Usługa internetowa ze stabilnym API jest znacznie lepsza, ale czasami po prostu go nie mamy.

Ogólny pomysł:

Najpierw trzeba wiedzieć, w jaki znaczniki (div, meta, span, etc) informacje chcesz są, i wiedzieć atrybuty zidentyfikować te tagi. Przykład:

<span class="price"> $7.95</span> 

jeśli szukasz to „cena”, to jesteś zainteresowany span tagów z class „cena”.

Parser HTML ma funkcję filtrowania według atrybutów.

filter = new HasAttributeFilter("class", "price"); 

Podczas analizowania stosując filtr, dostaniesz listę Nodes że można zrobić operację instanceof na nich, aby ustalić, czy są one typu jesteś zainteresowany, na span chcesz coś zrobić jak

if (node instanceof Span) // or any other supported element. 

Zobacz listę obsługiwanych tagów here.

Przykładem z HTML Parser chwycić meta tag, który ma opis witryny:

Tag Sample:

<meta name="description" content="Amazon.com: frankenstein: Books"/> 

Kod:

import org.htmlparser.Node; 
import org.htmlparser.Parser; 
import org.htmlparser.util.NodeList; 
import org.htmlparser.util.ParserException; 
import org.htmlparser.filters.HasAttributeFilter; 
import org.htmlparser.tags.MetaTag; 

public class HTMLParserTest { 
    public static void main(String... args) { 
     Parser parser = new Parser(); 
     //<meta name="description" content="Some texte about the site." /> 
     HasAttributeFilter filter = new HasAttributeFilter("name", "description"); 
     try { 
      parser.setResource("http://www.youtube.com"); 
      NodeList list = parser.parse(filter); 
      Node node = list.elementAt(0); 

      if (node instanceof MetaTag) { 
       MetaTag meta = (MetaTag) node; 
       String description = meta.getAttribute("content"); 

       System.out.println(description); 
       // Prints: "YouTube is a place to discover, watch, upload and share videos." 
      } 

     } catch (ParserException e) { 
      e.printStackTrace(); 
     } 
    } 

} 
0

Tag na google page- <title>Google</title> Próbuję odzyskać treść tekstową w tagu title.Ale nie otrzymuję danych wyjściowych.To pokazuje Build Successfull i generuje wynik jako "TITLE". Potrzebuję danych wyjściowych jako "GOOGLE".

import org.htmlparser.Node; 
import org.htmlparser.Parser; 
import org.htmlparser.filters.HasAttributeFilter; 
import org.htmlparser.filters.IsEqualFilter; 
import org.htmlparser.tags.MetaTag; 
import org.htmlparser.tags.TitleTag; 
import org.htmlparser.util.NodeList; 
import org.htmlparser.util.ParserException; 
public class MM { 
public static void main(String[] args) { 
     Parser parser=new Parser(); 


     try 
     { 
      parser.setResource("http://www.google.com"); 
      TitleTag title=new TitleTag(); 
      String tagtext=title.getTitle(); 
      System.out.println(tagtext); 


     } 

     }catch (ParserException e) { 

     } 

    } 
} 
Powiązane problemy