2013-03-06 7 views
0

На данный момент я пытаюсь скрести формы с некоторых сайтов с помощью следующего запроса:Можно ли фильтровать элементы-потоки, возвращаемые из запроса 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 и другими элементами под формой.

+0

Насколько важно это отфильтрованные узлы возвращаются в 'form' тега? Я не вижу, как выглядит результат вашего запроса, но элементы должны возвращаться в том порядке, в котором они отображаются в документе. Я могу подумать о том, как фильтровать нужные вам узлы, но не внутри родительского тега, как вам кажется. – JWiley

+0

Также вы используете XPath 1.0 или 2.0? – JWiley

+0

@JWiley: это XPath 1.0, я не думаю, что YQL поддерживает 2.0. Очень важно, чтобы отфильтрованные узлы были возвращены под тегом формы, так как на одной странице может быть несколько форм, что не позволило бы узнать, какие входы принадлежат этому элементу формы. –

ответ

1

Я не думаю, что это будет возможно в простом запросе, как вы попробовали.

Однако, это не было бы слишком много работы по созданию новой таблицы данных, содержащей некоторый JavaScript, который выполняет фильтрацию, которую вы ищете.

Таблица данных

Быстрый, маленький <execute> блок может выглядеть следующим образом.

var elements = y.query("select * from html where [email protected] and [email protected]", {u: url, x: xpath}).results.elements(); 
var results = <url url={url}></url>; 
for each (element in elements) { 
    var result = element.copy(); 
    result.setChildren(""); 
    result.normalize(); 
    for each (descendant in y.xpath(element, filter)) { 
     result.node += descendant; 
    } 
    results.node += result; 
} 
response.object = results; 

»См. the full example data table.

Пример запроса

use "store://VNZVLxovxTLeqYRH6yQQtc" as example; 
select * from example where url="http://www.yahoo.com" 

»Смотри this query in the YQL console

Пример результатов

Query results XML

Будем надеяться, что выше, является шагом в правильном направлении, и не выглядят слишком устрашающе.

Ссылки

+0

Спасибо за это, это большая помощь. Я еще не стал разбираться с использованием JavaScript в Open Data Tables, но похоже, что я мог бы сделать с ним много полезного материала. –

0

Это, как я бы фильтровать определенные узлы, но по-прежнему позволяют родительский тег со всеми атрибутами, чтобы показать:

//form[@name]/@* | //form[@action]/descendant-or-self::node()[name()='input' or name()='select' or name()='textarea' or name()='label'] 

Если существует несколько форм тегов на странице, они должны быть сгруппированы от этого родительского тега и не все вклиниваются вместе и не поддаются определению.

Вы также можете отменить объединение, если это поможет, как вы хотели бы узлы появляться:

//form[@action]/descendant-or-self::node()[name()='input' or name()='select' or name()='textarea' or name()='label'] | //form[@name]/@* 
+0

Спасибо за помощь, но, к сожалению, ни одна из них не улучшает мою собственную попытку решения - результат остается тем же. –

+0

Результат не должен совпадать, ваш текущий xpath не дает группировку с включенным тегом 'form' в качестве родителя. – JWiley

+0

Простите, что ваш тоже не копируется и не вставлен прямо в запрос –

 Смежные вопросы

  • Нет связанных вопросов^_^