我正在使用Apache HttpClient来执行POST请求并收到一个简单的HTML页面作为响应。我想从HttpResponse对象中提取一些元素,但我不想使用任何第三方库。
简单的解决方案是使用EntityUtils.toString()
是否有其他方法以更精细的方式做同样的事情。例如,我可以解析网页并执行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"><pre>deleted("/content/dam/dlv/images/entity/hotel/yvr/yvr_bwdv_bwdv/yvr_bwdv_bwdv-2.jpg");<br/></pre></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>
答案 0 :(得分:0)
我强烈建议使用像Jsoup这样的专用解析器 - 它非常灵活且易于使用HTML解析器。我支持CSS选择器,因此您可以选择适当的元素,如input.myClass[type=text]
或id select("#idOfElement")
等。
有时网页可能会被破坏,例如。没有结束标签等。在这种情况下,Jsoup是lanient,而XML解析器则不是。我用了很长时间,我很满意。