0

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());

上記の正しい解決策が見つからないため、さらに案内してください

4

1 に答える 1

3

「完全な」xpath を使用しないようにしてください。

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

よりも良い

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

ほとんどの HTML ページは無効であるか、整形式でさえありません。そのため、「実際の HTML パーサー」によって処理されると、DOM 構造が変わる可能性があります。たとえば、a<tbody>がない場合は下に挿入できます<table>。異なる HTML パーサーが異なる DOM ツリーを生成すると、事態はさらに悪化します。そのため、1 つのパーサーに対して 1 つの XPath が有効で、他のパーサーでは有効ではない場合があります。ortable//tr[4]の代わりに「ワイルドカード」 like を使用して、 を忘れられるようにします。このような式は、乱雑な実際の HTML ページに対して使用すると、より堅牢になります。table/tbody/tr[4]table/tr[4]<tbody>

Firefox のプラグインである Firebug のプラグインである Firepath を使用して、XPath 式をデバッグできます。

ps まさにこのタスクのために、私の JHQL (http://github.com/wks/jhql) プロジェクトを試すことができます。データを抽出するページがさらにある場合は、気に入るはずです。

于 2011-08-13T07:52:15.167 に答える