我必须从中提取公司名称和面值 http://money.rediff.com/companies/20-microns-ltd/15110088
我注意到这个任务可以使用xpath api完成。 因为这是一个html页面,我使用的是jtidy解析器。
这是我必须提取的面值的xpath。
/html/body/div[4]/div[6]/div[9]/div/table/tbody/tr[4]/td[2]
这是我的代码
URL oracle = new URL("http://money.rediff.com/companies/20-microns-ltd/15110088");
URLConnection yc = oracle.openConnection();
InputStream is = yc.getInputStream();
is = oracle.openStream();
Tidy tidy = new Tidy();
tidy.setQuiet(true);
tidy.setShowWarnings(false);
Document tidyDOM = tidy.parseDOM(is, null);
XPathFactory xPathFactory = XPathFactory.newInstance();
XPath xPath = xPathFactory.newXPath();
String expression = "/html";
XPathExpression xPathExpression = xPath.compile(expression);
Object result = xPathExpression.evaluate(tidyDOM,XPathConstants.NODESET);
System.out.println(result.toString());
请进一步指导我,因为,我无法找到适合上述的解决方案
答案 0 :(得分:3)
尽量不要使用“完整”的xpath。
//div[@id='leftcontainer']//div[9]//table//tr[4]/td[2]
优于
/html/body/.../.../.../.../.../...
大多数HTML网页无效或格式正确。因此,当由“真实世界的HTML解析器”处理时,DOM结构可能会改变。例如,如果没有<tbody>
,可以在<table>
下插入table//tr[4]
。当不同的HTML解析器生成不同的DOM树时,情况会更糟,因此一个XPath可能对一个解析器有效,但对另一个解析器则无效。我宁愿使用table/tbody/tr[4]
之类的“通配符”代替table/tr[4]
或<tbody>
,这样我就可以忘记{{1}}。当用于对付凌乱的真实HTML页面时,这样的表达式更加健壮。
您可以使用Firepath(Firebug的插件,它是Firefox的插件)来调试XPath表达式。
P.S。您可以尝试我的JHQL(http://github.com/wks/jhql)项目来完成此任务。如果您有更多页面可以从中提取数据,您会喜欢它。