Игнорирует HTML специальные символы при чтении веб-сайта с использованием Java DocumentBuilder () - PullRequest
1 голос
/ 23 января 2012

Я пытаюсь прочитать веб-сайт (HTML) с помощью Java DocumentBuilder (), он читает, но когда есть знак html £ “ или любые другие специальные html-символы.Он перестает читать что-либо после специального символа, вместо этого он возвращает ноль.Многие другие люди задавали подобные вопросы.Но на это нет конструктивного ответа.Пожалуйста, дайте мне знать, если кто-нибудь знает способ решить эту проблему.Пожалуйста, найдите мой код здесь.

<html> <body> <p> он увеличивается с £ 488 до £ 600 </p> <p> Роналс говорит: «Школы в этом попадают под бедность» </p>
</body> </html>

Чтобы прочитать их, я написал следующий код.

private String extractTheTitle(String responseBody) throws Exception {
    DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
    ByteArrayInputStream encXML = new  ByteArrayInputStream(responseBody.getBytes("UTF8"));
    Document embeddedDoc = builder.parse(encXML);
    NodeList titleNodes = embeddedDoc.getElementsByTagName("p");

    if (titleNodes != null && titleNodes.getLength() > 0) {
    for(int i = 0; i<titleNodes.getLength(); i++) {                 

            Element aTitleElement = (Element) titleNodes.item(i);
        aTitleElement.normalize();
        Node titleContent = aTitleElement.getFirstChild();
        String nodeText = titleContent.getNodeValue();
        myArrlist.add(i , "<p>"+nodeText+"</p>");
        }
    }

}

вышеупомянутый код ничего не выводит после £ или «У меня естьперепробовал много способов но ничего не получалось.Пожалуйста, дайте мне знать, если кто-нибудь знает ответ.Я воспользовался помощью следующего сайта.Но это не помогло.Я не хочу удалять специальные символы HTML.Потому что я читаю эти p-теги и перестраиваю свою собственную html-страницу только с этими

тегами.

http://www.developerfeed.com/xml/common/issues/xml-parsing-failing-due-encoding-not-being-utf-8

Ответы [ 2 ]

1 голос
/ 24 января 2012

Каждый aTitleElement (<p>...</p>) содержит более одного узла, один из которых является сущностью.Так что вместо getFirstChild он должен выполнять итерации по всем дочерним элементам;нормализация там не помогает.

StringBuilder pText = new StringBuilder();
NodeList children = aTitleElement.getChildNodes();
for (int j = 0; j < children.getLength(); ++j) {
    Node child = children.item(j);
    if (child.getNodeType() == Node.ENTITY_REFERENCE_NODE) {
        ...
    }
    pText.append(child.getNodeValue());
}
nodeText = pText.toString();

Тестовый файл

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<title></title>
</head>
<body>
<p>Saluton,&pound;&ldquo; mondo!</p>
</body></html>

Мой код

    DocumentBuilder builder =
        DocumentBuilderFactory.newInstance().newDocumentBuilder();
    Document embeddedDoc = builder.parse(new File("/home/joop/test.html"));
    NodeList pNodes = embeddedDoc.getElementsByTagName("p");
    StringBuilder pText = new StringBuilder();
    for (int i = 0; i < pNodes.getLength(); ++i) {
        Element pElement = (Element) pNodes.item(i);
        NodeList children = pElement.getChildNodes();
        for (int j = 0; j < children.getLength(); ++j) {
            Node child = children.item(j);
            String value = child.getNodeValue();
            if (value == null) {
                System.out.println("node name=" + child.getNodeName()
                    + ": " + child.getNodeType());
            }
            pText.append(value);
        }
        pText.append("\n");
    }
    String text = pText.toString();
    System.out.println("FOUND TEXT:");
    System.out.println(text);

Результат

FOUND TEXT:
Saluton,£“ mondo!
0 голосов
/ 26 января 2012

Код, который будет извлекать данные.Пожалуйста, используйте веб-сайт URL.

* Новый код

public void process() {
   HttpGet getMethod = new HttpGet("URL OF THE WEB SITE GOES HERE");
   try {
   ResponseHandler<String> responseHandler = new BasicResponseHandler();
   String websiteBody = client.execute(getMethod, responseHandler);
   String title = extractBody(websiteBody);
   }
}



private String extractBody(String responseBody) throws Exception {

DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document embeddedDoc = builder.parse(new InputSource(new StringReader(responseBody)));
//ByteArrayInputStream encXML = new   ByteArrayInputStream(responseBody.getBytes("UTF8"));      
//Document embeddedDoc = builder.parse(encXML); 
//Document embeddedDoc = builder.parse(new File("/home/joop/test.html"));
    NodeList pNodes = embeddedDoc.getElementsByTagName("p");
    StringBuilder pText = new StringBuilder();
    for (int i = 0; i < pNodes.getLength(); ++i) {
        Element pElement = (Element) pNodes.item(i);
        NodeList children = pElement.getChildNodes();
        for (int j = 0; j < children.getLength(); ++j) {
            Node child = children.item(j);
            String value = child.getNodeValue();
            if (value == null) {
                System.out.println("node name=" + child.getNodeName()
                    + ": " + child.getNodeType());
                value = value+convert(child.getNodeName());

            }
            System.out.println(value.replaceAll("null", ""));
            pText.append(value);
        }
        pText.append("\n");
    }
    String text = pText.toString();
    System.out.println("FOUND TEXT:");
    System.out.println(text);
    }
...