使用DocumentBuilder解析Java中的HTML响应

时间:2015-03-23 12:45:09

标签: java apache-httpclient-4.x

我正在使用Apache HttpClient来执行POST请求并收到一个简单的HTML页面作为响应。我想从HttpResponse对象中提取一些元素,但我不想使用任何第三方库。 简单的解决方案是使用EntityUtils.toString()

获取String对象

是否有其他方法以更精细的方式做同样的事情。例如,我可以解析网页并执行getElementById()吗?

我试过

DocumentBuilderFactory respFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder responseBuilder = respFactory.newDocumentBuilder();
Document responseDoc = responseBuilder.parse(responseEntity.getContent());
Element changeLog = responseDoc.getElementById("ChangeLog");
System.out.println(changeLog.getFirstChild().getNodeValue());

但我得到了NPE!

响应如下:

<html>
<head>
    <title>Content modified /</title>
</head>
<body>
<h1>Content modified /</h1>
<table>
    <tbody>
        <tr>
            <td>Status</td>
            <td><div id="Status">200</div></td>
        </tr>
        <tr>
            <td>Message</td>
            <td><div id="Message">OK</div></td>
        </tr>
        <tr>
            <td>Location</td>
            <td><a href="/" id="Location">/</a></td>
        </tr>
        <tr>
            <td>Parent Location</td>
            <td><a href="" id="ParentLocation"></a></td>
        </tr>
        <tr>
            <td>Path</td>
            <td><div id="Path">/</div></td>
        </tr>
        <tr>
            <td>Referer</td>
            <td><a href="" id="Referer"></a></td>
        </tr>
        <tr>
            <td>ChangeLog</td>
            <td><div id="ChangeLog">&lt;pre&gt;deleted("/content/dam/dlv/images/entity/hotel/yvr/yvr_bwdv_bwdv/yvr_bwdv_bwdv-2.jpg");&lt;br/&gt;&lt;/pre&gt;</div></td>
        </tr>
    </tbody>
</table>
<p><a href="">Go Back</a></p>
<p><a href="/">Modified Resource</a></p>
<p><a href="">Parent of Modified Resource</a></p>
</body>
</html>

1 个答案:

答案 0 :(得分:0)

我强烈建议使用像Jsoup这样的专用解析器 - 它非常灵活且易于使用HTML解析器。我支持CSS选择器,因此您可以选择适当的元素,如input.myClass[type=text]或id select("#idOfElement")等。 有时网页可能会被破坏,例如。没有结束标签等。在这种情况下,Jsoup是lanient,而XML解析器则不是。我用了很长时间,我很满意。

http://jsoup.org/