На данный момент я пытаюсь скрести формы с некоторых сайтов с помощью следующего запроса:Можно ли фильтровать элементы-потоки, возвращаемые из запроса XPath?
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
]
}
}
}
}
На некоторых сайтах это может пойти много уровней глубоко, поэтому я не уверен, как начать пытаться отфильтровывать нежелательные элементы в результате. Если бы я мог отфильтровать их здесь, это сделало бы мой задний код намного проще. В принципе, мне бы хотелось, чтобы форма и любые метки, входные данные, выбор (и опция) и потомки textarea.
Вот XPath запрос Я пытался, но я понял, что иерархия элементов не будет поддерживаться, и это может вызвать проблемы, если есть несколько форм на странице:
//form[@action]/descendant-or-self::*[self::form or self::input or self::select or self::textarea or self::label]
Однако я заметил, что элементы, возвращаемые этим запросом, больше не возвращались под divs и другими элементами под формой.
Насколько важно это отфильтрованные узлы возвращаются в 'form' тега? Я не вижу, как выглядит результат вашего запроса, но элементы должны возвращаться в том порядке, в котором они отображаются в документе. Я могу подумать о том, как фильтровать нужные вам узлы, но не внутри родительского тега, как вам кажется. – JWiley
Также вы используете XPath 1.0 или 2.0? – JWiley
@JWiley: это XPath 1.0, я не думаю, что YQL поддерживает 2.0. Очень важно, чтобы отфильтрованные узлы были возвращены под тегом формы, так как на одной странице может быть несколько форм, что не позволило бы узнать, какие входы принадлежат этому элементу формы. –