如何使用jtidy和xpath提取数据

时间:2011-08-13 07:16:10

标签: xpath jtidy

我必须从中提取公司名称和面值     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());

请进一步指导我,因为,我无法找到适合上述的解决方案

1 个答案:

答案 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)项目来完成此任务。如果您有更多页面可以从中提取数据,您会喜欢它。