извлекать HTML с Java - некоторые символы загружены неправильно - PullRequest
1 голос
/ 10 марта 2012

Мне нужно получить HTML с турецких веб-страниц, используя Java.Тем не менее, я обнаружил, что мой Java-код не может подобрать определенные турецкие символы.Вот код Java, который я использую:

import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.InputStream;
import java.net.URL;

public class fetchHTML {
public static void main(String[] args) throws Exception {

    URL urls = new URL("http://www.parkbravo.com.tr/pantolon.php");
    InputStream is = urls.openStream();  
    DataInputStream dis = new DataInputStream(new BufferedInputStream(is));

    String line;

    while ((line = dis.readLine()) != null) {
        System.out.println(line);
    }
}
}

Первые несколько строк этого кода выглядят так:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" />
<html lang="tr" xmlns:og="http://opengraphprotocol.org/schema/" xmlns:fb="http://www.facebook.com/2008/fbml">
<head>
<title>ParkBravo - Ãrünler - Pantolonlar</title>

Вы видите, что заголовок неверен: Аренлер должен бытьÜrünler

Если я использую следующий код Python для получения HTML-кода:

import urllib2

url = 'http://www.parkbravo.com.tr/pantolon.php' 

usock = urllib2.urlopen(url)
data = usock.read()
usock.close()

print data

, то вывод правильный.Название выглядит так:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" />
<html lang="tr" xmlns:og="http://opengraphprotocol.org/schema/" xmlns:fb="http://www.facebook.com/2008/fbml">
<head>
<title>ParkBravo - Ürünler - Pantolonlar</title>

Но я хочу иметь возможность получить HTML с Java.Кто-нибудь знает, как я могу заставить это работать?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 10 марта 2012

Чтобы подобрать определенные турецкие символы, используйте кодировку "UTF8", которая задается в качестве параметра для объекта InputStreamReader. И вы должны использовать BufferedReader, как предложил Якуб Заверка в своем ответе. Полностью рабочая версия вашего кода:

public static void main ( String [] args ) throws Exception
{
    URL url = new URL( "http://www.parkbravo.com.tr/pantolon.php" );
    InputStream is = url.openStream();
    BufferedReader r = new BufferedReader( new InputStreamReader( is, "UTF8" ) );
    String line = "";

    while ( ( line = r.readLine() ) != null )
        System.out.println( line );
}
2 голосов
/ 10 марта 2012

readLine() в DataInputStream устарело.Вы должны использовать Reader, который правильно обрабатывает преобразование байтов в символы.

Если вы используете InputStreamReader, вы можете указать кодировку в конструкторе, а если вы поместите его в BufferedReader, вы можете читать строки.

вы можете иметь

 BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"))

Где «UTF-8» может быть заменен любой кодировкой, которая вам нужна.

...