Я довольно новичок в Java, по крайней мере, в отношении взаимодействия с сетью. В любом случае я создаю приложение, которое должно извлекать HTML из веб-страницы и анализировать его.
Под синтаксическим анализом я подразумеваю выяснение того, что элемент имеет в атрибуте 'class = "" или в любом атрибуте, доступном в элементе. Также выяснить, что находится внутри элемента. Вот где я искал до сих пор: http://www.java2s.com/Code/Java/Development-Class/HTMLDocumentElementIteratorExample.htm
Я нашел очень мало об этом.
Я знаю, что есть много парсеров Java. Я пробовал JTidy и парсер Swing по умолчанию. Я бы предпочел использовать встроенный парсер в java.
Вот то, что у меня есть (это просто метод для проверки того, как он работает, правильный код придет, когда я узнаю, что и как. Также connection - это переменная URLConnection, и соединение было установлено до вызова этого метода. <просто уточнить): </p>
public void parse() {
try {
InputStream is = connection.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
// copied from http://www.java2s.com/Code/Java/Development-Class/HTMLDocumentElementIteratorExample.htm
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);
// Parse
ElementIterator iterator = new ElementIterator(htmlDoc);
Element element;
while ((element = iterator.next()) != null) {
AttributeSet attributes = element.getAttributes();
Object name = attributes.getAttribute(StyleConstants.NameAttribute);
System.out.println ("All attrs of " + name + ": " + attributes.getAttributeNames().toString());
Enumeration e = attributes.getAttributeNames();
Object obj;
while (e.hasMoreElements()) {
obj = e.nextElement();
System.out.println (obj.toString());
System.out.println ("attribute of class = " + attributes.containsAttribute("class", "login"));
}
if ((name instanceof HTML.Tag)
&& ((name == HTML.Tag.H1) || (name == HTML.Tag.H2) || (name == HTML.Tag.H3))) {
// Build up content text as it may be within multiple elements
StringBuffer text = new StringBuffer();
int count = element.getElementCount();
for (int i = 0; i < count; i++) {
Element child = element.getElement(i);
AttributeSet childAttributes = child.getAttributes();
if (childAttributes.getAttribute(StyleConstants.NameAttribute) == HTML.Tag.CONTENT) {
int startOffset = child.getStartOffset();
int endOffset = child.getEndOffset();
int length = endOffset - startOffset;
text.append(htmlDoc.getText(startOffset, length));
}
}
System.out.println(name + ": " + text.toString());
}
}
} catch (IOException e) {
System.out.println ("Exception?1 " + e.getMessage() );
} catch (Exception e) {
System.out.println ("Exception? " + e.getMessage());
}
}
Вопрос в том, как мне получить атрибуты любого элемента и распечатать их?