0

Jsoup を使用して HTML ページを解析しようとしていますが、いくつかの奇妙な問題が見つかりました。ページはhttp://www.filmaffinity.com/en/film290741.htmlであり、ご覧のとおり整形式ではありません。解析に影響すると思われるいくつかの問題があります。Firebug と Chrome を使用して、探している要素への XPath を取得しました (ページの 5.8 レート)。

  • Chrome は次を指します。 /html/body/table[2]/tbody/tr/td[2]/table/tbody/tr[1]/td/table[1]/tbody/tr/td[2]/table/tbody/tr[2]/td

  • Firebug は次のことを指しています。 /html/body/table[2]/tbody/tr/td[2]/table/tbody/tr/td/table/tbody/tr/td[2]/table/tbody/tr[2]/td

    唯一の違いは、Firebug には表示されない Chromeの1です。パスを手動で確認しましたが、正しいです。

次に、特定の要素を後で抽出するために、xpath を Jsoup as の CSS クエリに変換しました。

Element rate=doc.select("html body table:nth-child(2) tbody tr td:nth-child(2) table tbody tr td table tbody tr td:nth-child(2) table tbody tr:nth-child(2) td") 

コードを実行しても適切に位置付けられませんが、XPath で次のように Firebug が参照する要素に位置付けられます。

wrong:/html/body/table[2]/tbody/tr/td[2]/table/tbody/tr/td/table/tbody/tr/td/table/tbody/tr[15]/td[2]
    right:/html/body/table[2]/tbody/tr/td[2]/table/tbody/tr/td/table/tbody/tr/td[2]/table/tbody/tr[2]/td

最後から見て、最初の違いは次のとおりです。

/td /テーブル/tbody/tr[15]/td[2]

2 番目の要素ではなく、最初の要素を取ります。

このような問題を解決する方法はありますか? 問題は HTML が適切に形成されていないことに関連しているのでしょうか、それとも、これを回避するために使用できる他の Jsoup テクニックが欠けているのでしょうか?

Jsoup を選択したのは、整形式でない Html を処理できるはずだったからです。私は要求が厳しすぎますか?

この種の問題に対処できる Jsoup の代替手段はありますか?

4

2 に答える 2

1

あなたはほとんどそこにいました!

問題は、(ほのめかしたように) に指定した式がselect()2 つの要素に一致することです。これを確認するには、Chrome 開発コンソールで JQuery を実行しました。

select()を返すElementsので、アクセスすることはできますrate.get(1)が、実際にはあまりよくわかりません。代わりに、クエリにもう少し改良を加えて、希望する評価を得ることができます。

Element rate=doc.select("html body table:nth-child(2) tbody tr td:nth-child(2) table tbody tr td table tbody tr td:nth-child(2) table tbody tr:nth-child(2) td[align=center]").first();

もう一方が中心にないため、これは機能tdします。

于 2013-06-06T05:58:45.840 に答える
0

「科学的な」解決策を見つけることができませんでした。代わりに、(さまざまな属性と要素に基づいて) 要素を定義する他の方法を検索しました。

これはエレガントなソリューションではありませんが、機能します。

JSoup が Selector の多くのオプションをサポートしていることは素晴らしいことです。唯一の欠点は、適切に形成されていない HTML を処理するための高度な機能が、それほど高度ではないことです。

于 2013-06-10T00:09:03.883 に答える