我想寻求您的帮助,因为我正试图解决一个涉及XPaths的问题。
我试图概括一个用户提供的多个XPath,以获得一个最适合所有提供的示例的XPath。这是一个我正在建立的网络刮取系统。
示例:如果用户提供以下xpath(每个路径指向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 )
广义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
你能就如何处理这件事向我提出建议吗?我正在考虑使用最长的Common策略,但是如果给出了一个糟糕的示例(如第四个例子),那么这个策略会过于概括,在这方面是否有任何库或开源软件?
我看到了一些类似的帖子(finding common ancestor from a group of xpath?和Howto find the first common XPath ancestor in Javascript?),但是他们谈论的是最长的共同祖先。
我正在用Javascript编写它,作为firefox扩展的一种形式。
感谢您的时间和任何帮助,将不胜感激!
发布于 2011-03-09 08:06:16
这里的问题是自动机最小化问题。所以,您有( Xpath4 1)、Xpath4 2(Xpath4 2)、Xpath4 3(Xpath4 3),并且您希望得到匹配相同节点的最小自动机Xpath4。THere也是关于信息丢失或不丢失的最小化问题,比如JPEG。对于精确最小化,你可以谷歌“有限自动机最小化算法”。
好的,最简单的方法是在将每个Xpath运算符转换为字符并从字符串列表中运行基于字符的子字符串查找器之后,找到公共子序列。举个例子
adcba,acba,adba -公共子字符串-> aba -一般reg exp->a.*b.a-转换回xpath->.
您还可以尝试设置一些不太一般的东西来代替.*。
https://stackoverflow.com/questions/5233074
复制相似问题