Как получить заголовок веб-страницы с помощью html-парсера - PullRequest
0 голосов
/ 09 июля 2010

Как я могу получить заголовок веб-страницы для данного URL с помощью HTML-парсера?Можно ли получить заголовок с помощью регулярных выражений?Я бы предпочел использовать анализатор HTML.

Я работаю в Java Eclipse IDE.

Я пытался использовать следующий код, но безуспешно.

Любые идеи?

Спасибо заранее!

import org.htmlparser.Node;

import org.htmlparser.Parser;

import org.htmlparser.util.NodeList;

import org.htmlparser.util.ParserException;

import org.htmlparser.tags.TitleTag;    

public class TestHtml {

public static void main(String... args) {
    Parser parser = new Parser();     
    try {
        parser.setResource("http://www.yahoo.com/");
        NodeList list = parser.parse(null);
        Node node = list.elementAt(0);

        if (node instanceof TitleTag) {
           TitleTag title = (TitleTag) node;


            System.out.println(title.getText());

        }

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

}

Ответы [ 5 ]

3 голосов
/ 09 июля 2010

В соответствии с вашим (переопределенным) вопросом, проблема в том, что вы проверяете только первый узел Node node = list.elementAt(0);, в то время как вы должны перебирать список, чтобы найти заголовок (который не первый).Вы также можете использовать NodeFilter для вашего parse() только для возврата TitleTag, и тогда заголовок будет первым, и вам не придется повторять.

1 голос
/ 09 июля 2010

Кстати, уже есть очень простой экстракт заголовка, который поставляется с HTMLParser Вы можете использовать это: http://htmlparser.sourceforge.net/samples.html

Метод для его запуска (из базы кода HtmlParser): Пробег:

bin/parser http://website_url TITLE

или запустить

java -jar <path to htmlparser.jar> http://website_url TITLE

или из вашего кода вызовите метод

org.htmlparser.Parser.main(String[] args)

с параметрами new String[] {"<website url>", "TITLE"}

1 голос
/ 09 июля 2010

Хорошо - если вы используете java, но в большинстве языков есть эквивалент - вы можете использовать SAX-парсер (например, TagSoup, который преобразует любой html в xhtml), и в вашем обработчике вы можете сделать:

public class MyHandler extends org.xml.sax.helpers.DefaultHandler {
    boolean readTitle = false;
    StringBuilder title = new StringBuilder();

    public void startElement(String uri, String localName, String name,
                Attributes attributes) throws SAXException {
        if(localName.equals("title") {
            readTitle = true;
        }
    }

    public void endElement(String uri, String localName, String name)
            throws SAXException {
        if(localName.equals("title") {
            readTitle = false;
        }
    }

    public void characters(char[] ch, int start, int length)
            throws SAXException {
        if(readTitle) title.append(new String(ch, start, length));
    }
}

и вы используете его в вашем парсере (пример с tagoup):

org.ccil.cowan.tagsoup.Parser parser = new Parser();
MyHandler handler = new MyHander();
parser.setContentHandler(handler);
parser.parse(an input stream to your html file);
return handler.title.toString();
0 голосов
/ 15 июля 2013

Это будет очень легко с использованием HTMLAgilityPack, вам нужно только получить ответ httpRequest в виде строки.

    String response=httpRequest.getResponseString(); // this may have a few changes or no 
HtmlDocument doc= new HtmlDocument();
doc.loadHtml(response);
HtmlNode node =doc.DocumentNode.selectSingleNode("//title"); // this line will fetch title tage from whole html document and return collection could iterate
node.innerText; //gives you the title of the page

helloWorld node.innerText содержит helloWorld

OR

String response=httpRequest.getResponseString(); // this may have a few changes or no 
HtmlDocument doc= new HtmlDocument();
doc.loadHtml(response);

HtmlNode node =doc.DocumentNode.selectSingleNode("//head");// this additional will get head which is a single node in html than get title from head's childrens
HtmlNode node =node.selectSingleNode("//title"); // this line will fetch title tage from whole html document and return collection could iterate


node.innerText; //gives you the title of the page
0 голосов
/ 09 июля 2010

RegEx соответствует открытым тегам, кроме автономных тегов XHTML

Умный, вы не хотите использовать Regex.

Чтобы использовать анализатор HTML, нам нужно знать, какой язык вы используете. Поскольку вы говорите, что находитесь «в затмении», я предполагаю, что Java.

Посмотрите на http://www.ibm.com/developerworks/xml/library/x-domjava/ описание, обзор и различные точки зрения.

...