0

我必须从http://money.rediff.com/companies/20-microns-ltd/15110088中提取 d 公司名称和面值

我注意到这个任务可以使用 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());

请进一步指导我,因为我找不到上述问题的正确解决方案

4

1 回答 1

3

尽量不要使用“完整”的 xpath。

//div[@id='leftcontainer']//div[9]//table//tr[4]/td[2]

好于

/html/body/.../.../.../.../.../...

大多数 HTML 页面是无效的,甚至是格式不正确的。因此,当“真实世界的 HTML 解析器”处理时,DOM 结构可能会发生变化。例如,如果没有,则<tbody>可以在下方插入a。<table>当不同的 HTML 解析器生成不同的 DOM 树时,情况会更糟,因此一个 XPath 可能对一个解析器有效,但对另一个解析器无效。我宁愿使用“通配符” liketable//tr[4]而不是table/tbody/tr[4]ortable/tr[4]这样我就可以忘记<tbody>. 当用于处理混乱的现实世界 HTML 页面时,此类表达式更加健壮。

您可以使用 Firepath(Firebug 的插件,后来成为 Firefox 的插件)来调试 XPath 表达式。

ps 你可以试试我的 JHQL (http://github.com/wks/jhql) 项目来完成这个任务。如果您有更多页面可以从中提取数据,您会喜欢它。

于 2011-08-13T07:52:15.167 回答