現在、次のクエリを使用して、いくつかのサイトからフォームをスクレイピングしようとしています。
select * from html
where url="http://somedomain.com"
and xpath="//form[@action]"
これは次のような結果を返します。
{
form: {
action: "/some/submit",
id: "someId",
div: {
input: [
... some input elements here
]
}
fieldset: {
div: {
input: [
... some more input elements here
]
}
}
}
}
一部のサイトでは、これが何層も深くなる可能性があるため、結果から不要な要素を除外する方法がわかりません。ここでそれらを除外できれば、バックエンド コードがはるかに簡単になります。基本的には、フォームとラベル、入力、選択 (およびオプション)、およびテキストエリアの子孫が欲しいだけです。
これは私が試した XPath クエリですが、要素の階層が維持されず、ページに複数のフォームがある場合に問題が発生する可能性があることに気付きました。
//form[@action]/descendant-or-self::*[self::form or self::input or self::select or self::textarea or self::label]
ただし、このクエリによって返される要素が、フォームの下の div やその他の要素の下に返されなくなっていることに気付きました。