Java - читайте сайт, а НЕ источник - PullRequest
1 голос
/ 08 июля 2010

ОК, поэтому я переопределил мою последнюю программу ... вот она:

import java.io.BufferedReader; 
import java.io.InputStreamReader;
import java.net.URL; 
import java.net.URLConnection;


public class asp {
    public static void main(String[] args) {
        try {
            URL game = new URL("http://localhost/mystikrpg/post.php?players");
            URLConnection connection = game.openConnection();
            BufferedReader in = new BufferedReader(new
            InputStreamReader(connection.getInputStream()));
            String inputLine;
            while ((inputLine = in.readLine()) != null) {
                System.out.println(inputLine);
            }
            in.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Проблема?Когда я запускаю его ... я получаю целую страницу ... ДАЖЕ ИСТОЧНИК КОДА, такой как начало тега html вплоть до конца тела и тега html.Я хочу, чтобы он выводил 1 .... Единственный способ увидеть это, если я разделю строку из <body> и </body> ...

Мех.Помощь

Ответы [ 5 ]

12 голосов
/ 08 июля 2010

Проблема?Когда я запускаю его ... я получаю целую страницу ... ДАЖЕ ИСТОЧНИК КОДА, такой как начало тега html вплоть до конца тела и тега html.

ХорошоВот в основном HTML-страница;так вот что ты получаешь.Теперь, если вы не хотите анализировать содержимое вручную, используйте анализатор HTML.Есть многих из них , но я бы порекомендовал Jsoup , одну из самых элегантных доступных библиотек (чистый и красивый API, jQuery, как CSS-селекторы , не многословныйитерация элементов и т. д.).Демо:

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;

public class JsoupDemo {
    public static void main(String[] args) throws Exception {
        URL url = new URL("http://localhost/mystikrpg/post.php?players");
        Document doc = Jsoup.parse(url, 3*1000);

        String text = doc.body().text();

        System.out.println(text); // outputs 1
    }
}

Смотри, Ма, без рук!

PS: В качестве примечания я должен сказать, что я согласен с некоторыми другими ответами здесь, возможно, вам следует подумать о создании чего-то другого, кроме HTML, такого как XML, JSON или даже необработанного текста (по крайней мере, в качестве альтернативыHTML версия, если она вам действительно нужна).

8 голосов
/ 08 июля 2010

Если у вас нет контроля над post.php и вы не можете заставить его возвращать то, что вам нужно, без HTML-тегов (а-ля веб-сервисы), вам придется анализировать возвращаемый им HTML-документ.

Используйте HTML Parser , регулярные выражения не очень надежны для этого.


Rough Snippet для анализа тега <body> с HTMLParser:

(Обязательно укажите htmlparser.jar)

import org.htmlparser.Node;
import org.htmlparser.Parser;
import org.htmlparser.util.NodeList;
import org.htmlparser.util.ParserException;    
import org.htmlparser.filters.TagNameFilter;
import org.htmlparser.tags.BodyTag;    

public class HTMLParserTest {   
    public static String grabBodyTag (String url) {
        if(!url.startsWith("http://")){url = "http://" + url;}      
        Parser parser = new Parser();               
        TagNameFilter filter = new TagNameFilter("body");       
        try {
            parser.setResource(url);
            NodeList list = parser.parse(filter);
            Node node = list.elementAt(0);          
            if (node instanceof BodyTag) {
                BodyTag tag = (BodyTag) node;
                return   tag.toPlainTextString(); //other formats are available
            }
        } catch (ParserException e) {
            e.printStackTrace();
        }       
        return "found no body tag...";
    }   
    public static void main(String... args){
        System.out.println(grabBodyTag("google.com"));
    }

}

Это дает String с «Web Images Видео Карты Новости Книги Gmail more ...» [опущен], в вашем случае он вернет String с «1» в нем, возможно, с пробелом в нем (как ваша пастина показывает), вам нужно trim, а затем сделать преобразование в число.

Заключительное примечание: создание post.php с (и только) следующим кодом сделает вашу жизнь намного проще , если вам не нужен этот скрипт для каких-либо других вещей, которые чтобы вернуть этот результат.

<?php
$number = 1; // or whatever login to get it.
echo $number;
?>
5 голосов
/ 08 июля 2010

Когда вы запрашиваете страницу, вы получаете источник.Это то, что ожидается и нормально.Вам придется проанализировать этот источник, чтобы извлечь содержимое.

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

Извлечение материала из ответа в формате HTML неприятно и может сделать ваш код хрупким.

Возможно, у веб-приложения / веб-сайта, о котором вы пытаетесь поговорить, есть другие способы доставки ответов;например, в формате XML или JSON.

Получение ответов в альтернативном формате может повлечь за собой установку соответствующего заголовка ACCEPT для HTTP-запроса, добавление некоторых дополнительных параметров в запрос или изменение пути.

  • Проверьте документацию веб-API для веб-приложения / веб-сайта, чтобы узнать, есть ли упоминания об этом.
  • Или проверьте исходный код веб-приложения ... если он у вас есть.
  • Или, если это ваш код, рассмотрите возможность его изменения для поддержки XML, JSON или даже ad hoc текстовые ответы.(Если вы выберете этот путь, было бы неплохо почитать о типах носителей и установить соответствующий в заголовке «Content-type» ваших ответов.)
1 голос
/ 08 июля 2010

Когда вы извлекаете веб-страницу, сервер посылает вам все, что находится между тегами HTML и т. Д.

Я думаю, что вам нужен анализатор HTML, который позволит вам извлекать контент извеб-страница.Сначала вы извлекаете веб-страницу, как и сейчас, а затем запускаете вывод через анализатор, инструктируя синтаксический анализатор извлечь нужную часть.

Вот некоторые анализаторы HTML:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...