我想寻求你的帮助,解决我试图解决的涉及XPath的问题。
我试图概括用户提供的多个Xpath,以获得最适合所有提供的示例的XPath。这是我正在建立的网络抓取系统。
例如:如果用户提供以下x路径(每个路径都指向Google新闻页面中“Spotlight”部分中的链接)
好例子:
/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
你能不能就如何解决这个问题向我提出建议。我正在考虑使用最长公共子串策略,但是如果给出了一个不好的例子(如第四个给出的例子)那会过度概括。是否有任何库或任何开源软件在这个区域完成?
我看到了一些类似的帖子(finding common ancestor from a group of xpath?和Howto find the first common XPath ancestor in Javascript?)但是他们谈论的是最长的共同祖先。
我用Javascript编写它作为firefox扩展的一种形式。
感谢您的时间和任何帮助将不胜感激!
答案 0 :(得分:1)
这里的问题是自动机最小化问题。所以你有(Xpath1 | Xpath2 | Xpath3),你想获得匹配相同节点的最小自动机Xpath4。这也是关于信息丢失与否的最小化的问题,如JPEG。对于精确最小化,您可以谷歌“有限状态自动机最小化的算法”。
好的,最简单的方法是在将每个Xpath运算符转换为字符并从字符串列表中运行基于字符的子字符串查找器后查找公共子序列。所以我们有例如
adcba,acba,adba --common substring - > aba --general reg exp - > a。* b。* a - 转换回xpath - > ...
您也可以尝试设置一些不太通用的东西来代替。*