【问题标题】:how to extract data using jtidy and xpath如何使用 jtidy 和 xpath 提取数据
【发布时间】:2011-08-13 07:16:10
【问题描述】:

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

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

【问题讨论】:

    标签: xpath jtidy


    【解决方案1】:

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

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

    优于

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

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

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

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

    【讨论】:

    • 我将遵循您的指导并在此处发布结果。同时,你对给定的代码有什么建议?
    • 您的代码中的某些对象可以共享。编译 XPath 很昂贵。如果页面应该被持续监控,您可以将 XPath 设置为静态字段。 Tidy 不是线程安全的(参见:link),但 HtmlCleaner 声称是安全的(参见 link)。然后也可以共享一个线程安全的 HTML 解析器。
    • 试试 Jaxen。根据我的经验,它比 Java 附带的 XPath 实现要快得多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-15
    • 1970-01-01
    • 1970-01-01
    • 2013-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多