Я использую Синтаксический анализатор 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");
}
}
}
Похоже, вы использовали Swing HtmlDocument. Возможно, это не самая удачная идея. Я считаю, что у вас будут лучшие результаты, используя, например, NekoHtml .
Согласно комментариям:
на самом деле я хочу извлечь такую информацию, как название продукта, цена и т. Д., Обо всех продуктах, перечисленных на сайте онлайн-покупок, таком как amazon.com. Как мне это сделать ???
Шаг 1: прочитал свой файл robots . Обычно он находится в корне сайта, например http://amazon.com/robots.txt . Если URL-адрес, к которому вы пытаетесь получить доступ, защищен Disallow
в User-Agent
из *
, то остановите здесь. Свяжитесь с ними, подробно объясните им, что вы пытаетесь сделать, и спросите их о способах / альтернативах / веб-сервисах, которые могут предоставить вам необходимую информацию. В противном случае вы нарушаете законы и рискуете попасть в черный список сайтом и / или вашим интернет-провайдером или, что еще хуже. Если нет, переходите к шагу 2.
Шаг 2: проверьте, не существует ли на данном сайте общедоступного веб-сервиса, который намного проще в использовании, чем анализ всей HTML-страницы. Используя веб-сервис, вы получите именно ту информацию, которую ищете, в кратком формате (JSON или XML) на основе простого набора параметров. Посмотрите вокруг или свяжитесь с ними для получения подробной информации о любых веб-сервисах. Если нет возможности, переходите к шагу 3.
Шаг 3: узнайте, как работают HTML / CSS / JS, узнайте, как работать с инструментами веб-разработчика, такими как Firebug, узнайте, как интерпретировать исходный код HTML / CSS / JS, который вы см. правым щелчком> Просмотр исходного кода страницы . Держу пари, что рассматриваемый сайт использует JS / Ajax для загрузки / заполнения информации, которую вы хотите собрать.В этом случае вам нужно будет использовать парсер HTML, который также может анализировать и выполнять JS (тот, который вы используете, не делает этого). Это будет нелегкая работа, поэтому я не буду ее подробно объяснять, пока не станет полностью ясно, чего вы пытаетесь достичь, и если это разрешено, и если нет более простых в использовании веб-сервисов. имеется в наличии.
Или еще одна простая библиотека, которую вы можете использовать, - jtidy, которая может очистить ваш html перед его анализом. Надеюсь, это поможет.
http://sourceforge.net/projects/jtidy/
Чао!
Я делаю это довольно надежно с помощью HTML Parser (при условии, что HTML-документ не меняет свою структуру). Веб-сервис со стабильным API намного лучше, но иногда у нас его просто нет.
Общая идея:
Сначала вы должны знать, в каких тегах ( div
, meta
, span
и т. Д.) Содержится нужная вам информация. , и знать атрибуты для идентификации этих тегов. Пример:
<span class="price"> $7.95</span>
если вы ищете эту «цену», то вас интересуют теги span
с классом
«цена».
HTML Parser имеет функцию фильтрации по атрибутам.
filter = new HasAttributeFilter("class", "price");
При синтаксическом анализе с использованием фильтра вы получите список узлов
, которые вы можете выполнить с ними операцию instanceof
, чтобы определить, относятся ли они к интересующему вас типу. , для span
вы должны сделать что-то вроде
if (node instanceof Span) // or any other supported element.
См. список поддерживаемых тегов здесь .
Пример использования HTML Parser для захвата метатега с описанием сайта:
Пример тега:
<meta name="description" content="Amazon.com: frankenstein: Books"/>
Код:
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();
}
}
}