java - 什么会让我的 html 解析代码更有效?

标签 java html parsing

今天早上,我决定要做一个小项目,将 maverik 加油站的所有汽油价格解析为一个数组。我相当轻松地完成了大部分工作,我觉得代码中唯一“脏”的部分是 html 到变量的实际解析。我正在使用 indexOf 和子字符串来获取我想要的数据,我觉得必须有一种更干净的方法来做到这一点?无论如何,这是我的代码,它编译并运行得很好,只是没有我想要的那么干净。

maverik.java包含项目的主要方法和大部分代码。 maverikObj.java包含 getter 和 setter、构造函数和 toString 方法。

要更改您从中获取控制台数据的加油站,只需更改 maverik.java 第 90 行上的数组 println 中的数字即可。 future 的修订版将提供根据用户请求控制显示数据的方法。

以下是包含价格的 HTML 示例:

html4 = "<b>Maverik Store 4</b><br/>5200 Chinden Blvd<br>Boise, ID<br>208-376-0532<br><center><b></b></center><br /><font color=red>Fuel Prices -- Updated every 30 minutes</font><br /><div><div style=\"float: left; width: 70%; text-align:right;\">Adventure Club Card</div><div style=\"float: right; width: 30%; text-align:center;\">Retail</div><br /><div style=\"float: left;width: 30%;\">Unleaded:</div><div style=\"float: left; width: 30%; text-align:center;\"> 3.379</div><div style=\"float: right; width: 30%; text-align:center;\"> 3.399</div><br /><div style=\"float: left;width: 30%;\">Blend 89:</div><div style=\"float: left; width: 30%; text-align:center;\"> 3.469</div><div style=\"float: right; width: 30%; text-align:center;\"> 3.499</div><br /><div style=\"float: left;width: 30%;\">Blend 90:</div><div style=\"float: left; width: 30%; text-align:center;\"> 3.549</div><div style=\"float: right; width: 30%; text-align:center;\"> 3.579</div><br /><div style=\"float: left;width: 30%;\">Premium:</div><div style=\"float: left; width: 30%; text-align:center;\"> 3.599</div><div style=\"float: right; width: 30%; text-align:center;\"> 3.639</div><br /><div style=\"float: left;width: 30%;\">Diesel:</div><div style=\"float: left; width: 30%; text-align:center;\"> 4.039</div><div style=\"float: right; width: 30%; text-align:center;\"> 4.059</div>";

目前我正在解析每个加油站的地址、城市、州、电话号码以及所有可能的 8 种汽油类型。 (无铅、混合 87、88、89、99、优质、柴油)。但它变得有点棘手,因为一些 html 条目没有列出所有 8 种燃料类型,大多数只有 8 种可能的燃料类型中的 4 或 5 种。因此,为了解析这些数据,我使用了两种方法。

地址、城市、州、电话号码的解析使用:

if(line.contains(" = \"<b>Maverik Store")&&!line.contains("Coming Soon!")){ address=splitLine[3].substring(0,splitLine[3].length()-3).replace(" ", " "); city=splitLine[4].substring(0,splitLine[4].length()-7); state=splitLine[4].substring(splitLine[4].length()-5,splitLine[4].length()-3); phone=splitLine[5].substring(0,splitLine[5].length()-3);

使用 if else 语句解析燃料类型,使用 if 语句记录数据(如果存在),使用 else 语句记录 0.0 double ,因为我的构造函数要求所有燃料类型都具有某个值。

if(line.indexOf("Unleaded:")>0){
    unleaded=Double.parseDouble(line.substring(line.indexOf("Unleaded:")+147, line.indexOf("Unleaded:")+152));
}
else{
    unleaded=0.0;
}

正如你所看到的,我使用了很多子字符串和indexOf字符串方法来获取我想要的数据。我担心这是一种获取我想要的数据的极其静态的方法,因此我觉得这是一种非常肮脏的做事方式。任何关于如何清理我的代码的提示都将受到赞赏! =)

最佳答案

好吧,一开始,我使用了完全不同的更漂亮的编码风格(根据我的意见)。但我建议您寻找一些不同的编码风格并决定您最喜欢什么。

我在 XML 文件方面也遇到过类似的问题,而且结果非常困惑。您能做的最好的事情就是编写一个自己的 XMLParser,并且由于 HTML 与 XML 结构没有什么不同,您也可以使用它来解析 HTML 文件。

由于这是一项相当艰苦的工作,我可以为您提供我的实现(如果您需要,请告诉我,当然,它是开源的)。它旨在让开发人员快速获得他想要的东西。使用示例:

XMLDocument document = new XMLDocument("yourXMLSourceCode");
XMLNode node = document.getNode("html.body.div");
String attribute = document.get("html.body.div?id");
String content = document.get("html.body.div.input");
XMLNode[] mynodes = document.getNode("html.body").getSubNodes("input");

您可能会通过搜索“SAX 解析器”或“XML 解析器”来找到其他解决方案,例如 this .

我认为你可以使用它,用该代码做一些小技巧,你就可以完美地将它用于 HTML。

否则,就像我在使用 HTML 时所做的那样,您可以使用 HTMLParser。我对Jsoup有很好的经验.

关于java - 什么会让我的 html 解析代码更有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15458356/

相关文章:

java - "Narrowing a primitive truncates the high order bits"这是什么意思

java - 使用 objectify 检查唯一的玩家

javascript - 使用 Jquery 和 nunjucks 将数据绑定(bind)到 html

javascript - 如何在我的代码中允许 "0."小数

c++ - 如何清除包含 C 函数声明的字符串中的注释和中间空格?

java - 如何创建两个边框

java - BufferedReader.readLine() 阻塞一段时间

html - 数据表对齐标题和数据列

java - 在Java中解析一个固定宽度的格式化文件

php - php中的json解析响应