Обобщение XPath - PullRequest
       8

Обобщение XPath

4 голосов
/ 08 марта 2011

Я хотел бы обратиться к вам за помощью в решении проблемы, связанной с XPath.

Я пытаюсь обобщить несколько путей Xpath, предоставленных пользователем, чтобы получить XPath, который наилучшим образом «соответствовал бы» всем приведенным примерам. Это для системы веб-очистки, которую я создаю.

Например: Если пользователь задает следующие xpaths (каждый указывает на ссылку в разделе «Spotlight» на странице Новостей Google)

Хорошие примеры:

/html/body/div[@id='page']/div/div[@id='main-wrapper']/div[@id='main']/div/div/div[3] /div[1]/table[@id='main-am2-pane']/tbody/tr/td[@id='rt-col']/div[3]/div[@id='s_en_us:ir']/div[2]/div[1]/div[2]/a[@id='MAE4AUgAUABgAmoCdXM']/span

/html/body/div[@id='page']/div/div[@id='main-wrapper']/div[@id='main']/div/div/div[3]/div[1]/table[@id='main-am2-pane']/tbody/tr/td[@id='rt-col']/div[3]/div[@id='s_en_us:ir']/div[2]/div[6]/div[2]/a[@id='MAE4AUgFUABgAmoCdXM']/span

/html/body/div[@id='page']/div/div[@id='main-wrapper']/div[@id='main']/div/div/div[3]/div[1]/table[@id='main-am2-pane']/tbody/tr/td[@id='rt-col']/div[3]/div[@id='s_en_us:ir']/div[2]/div[12]/div[2]/a[@id='MAE4AUgLUABgAmoCdXM']/span

Плохие примеры: (указывает на ссылку в другом разделе)

/html/body/div[@id='page']/div/div[@id='main-wrapper']/div[@id='main']/div/div/div[3]/div[1]/table[@id='main-am2-pane']/tbody/tr/td[@id='lt-col']/div[2]/div[@id='replaceable-section-blended']/div[1]/div[4]/div/h2/a[@id='MAA4AEgFUABgAWoCdXM']/span

Должно быть в состоянии обобщить и создать выражение xpath , которое выберет все ссылки в разделе «Spotlight». (Должно быть в состоянии выкинуть неправильный заданный путь xpath)

Обобщенная XPath

/html/body/div[@id='page']/div/div[@id='main-wrapper']/div[@id='main']/div/div/div[3]/div[1]/table[@id='main-am2-pane']/tbody/tr/td[@id='rt-col']/div[3]/div[@id='s_en_us:ir']/div[2]/div/div[2]/a[@id='MAE4AUgLUABgAmoCdXM']/span

Не могли бы вы дать мне совет, как это сделать. Я думал об использовании стратегии Longest Common Substring, но, тем не менее, это привело бы к чрезмерному обобщению, если был бы приведен плохой пример (например, четвертый приведенный пример). Существуют ли какие-либо библиотеки или программное обеспечение с открытым исходным кодом, которое было сделано в этой области?

Я видел несколько похожих постов ( найти общего предка из группы xpath? и Как найти первого общего предка XPath в Javascript? ) Однако они говорят о самом длинном общем предке .

Я пишу это в Javascript как форму расширения Firefox.

Спасибо за ваше время, и любая помощь будет принята с благодарностью!

1 Ответ

1 голос
/ 09 марта 2011

Вопрос здесь в задаче минимизации Automaton.Таким образом, у вас есть (Xpath1 | Xpath2 | Xpath3), и вы хотели бы получить минимальный автомат Xpath4, который соответствует тем же узлам.Есть также вопрос о минимизации с потерей информации или нет, как JPEG.Для точной минимизации вы можете использовать Google «Алгоритмы минимизации конечных автоматов».

Хорошо, самый простой способ - найти общую подпоследовательность после преобразования каждого оператора Xpath в символ и запустить искатель подстроки на основе символов из списка строк,Таким образом, мы имеем, например,

adcba, acba, adba --common substring -> aba - общий reg exp -> a. * B. * A --convert back to xpath -> ...

Вы также можете попытаться установить что-то менее общее вместо. *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...