【问题标题】:How to extract relative Xpaths of a WebPage from a URL如何从 URL 中提取网页的相对 Xpath
【发布时间】:2018-11-22 04:19:32
【问题描述】:

我正在开发一个程序来列出网页内的元素及其相应的相对 xpath。 使用 Java 和 JSoup,我想提取为任何给定网页中的所有元素动态创建的相对 Xpath。一个完整而小型的工作实用程序肯定会在这里帮助我。

我想要类似的东西:

//*[@id="menu-item-13686"]/a

示例输出:

Element Or Node or component Name: xxxx AND Xpath = //*[@id="menu-item-13686"]/a

谢谢

【问题讨论】:

  • 欢迎来到 Stack Overflow!请阅读How to Ask 页面并更新您的问题。
  • 你好@JeroenHeier,正如我所建议的,我已经更新了我的问题,但不确定为什么它被否决了。
  • 你好@Luk,谢谢你,我已经看到提供的链接,但是,我正在寻找另一种方式。我实际上是在尝试从 webPage 动态构建所有现有元素或组件的 Xpath 列表映射。

标签: dom xpath jsoup html-parsing sample


【解决方案1】:

我想你可以从这个开始。

问题已在 jOOX - 1.6.1 版本中得到修复 使用 Java 10 编译

参考https://github.com/jOOQ/jOOX/issues/158

下面的代码 sn-p 选择所有元素,并为每个元素打印出节点名称、标签名称和 CSS 选择器以及将唯一选择该元素的 Xpath。

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.joox.selector.CSS2XPath;

public class TestParser {

public static void main(String[] args) {

    try {
        Document doc = Jsoup.connect("https://theuserisdrunk.com/").get();
        Elements elements = doc.select("*");
        for (Element element : elements) {
            String path = CSS2XPath.css2xpath(element.cssSelector(), true);
            System.out.println("Node name : " + element.nodeName());
            System.out.println("      Tag : " + element.tagName());
            System.out.println("      CSS : " + element.cssSelector());
            System.out.println("    XPath : " + path + "\n");

        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

}

样本输出:

 Node name : div
      Tag : div
      CSS : #mc-embedded-subscribe-form > div.clear:nth-child(4)
    XPath : //*[@id='mc-embedded-subscribe-form']/div[@class='clear' or starts-with(@class, 'clear ') or ' clear' = substring(@class, string-length(@class) - string-length(' clear') + 1) or contains(@class, ' clear ')][count(preceding-sibling::*) = 4 - 1]

Node name : input
      Tag : input
      CSS : #mc-embedded-subscribe
    XPath : //*[@id='mc-embedded-subscribe']

Node name : p
      Tag : p
      CSS : #mc_embed_signup > p.intern:nth-child(2)
    XPath : //*[@id='mc_embed_signup']/p[@class='intern' or starts-with(@class, 'intern ') or ' intern' = substring(@class, string-length(@class) - string-length(' intern') + 1) or contains(@class, ' intern ')][count(preceding-sibling::*) = 2 - 1]

Node name : a
      Tag : a
      CSS : #mc_embed_signup > p.intern:nth-child(2) > a
    XPath : //*[@id='mc_embed_signup']/p[@class='intern' or starts-with(@class, 'intern ') or ' intern' = substring(@class, string-length(@class) - string-length(' intern') + 1) or contains(@class, ' intern ')][count(preceding-sibling::*) = 2 - 1]/a

Node name : p
      Tag : p
      CSS : #mc_embed_signup > p.intern:nth-child(3)
    XPath : //*[@id='mc_embed_signup']/p[@class='intern' or starts-with(@class, 'intern ') or ' intern' = substring(@class, string-length(@class) - string-length(' intern') + 1) or contains(@class, ' intern ')][count(preceding-sibling::*) = 3 - 1]

Node name : i
      Tag : i
      CSS : #mc_embed_signup > p.intern:nth-child(3) > i
    XPath : //*[@id='mc_embed_signup']/p[@class='intern' or starts-with(@class, 'intern ') or ' intern' = substring(@class, string-length(@class) - string-length(' intern') + 1) or contains(@class, ' intern ')][count(preceding-sibling::*) = 3 - 1]/i

Node name : p
      Tag : p
      CSS : #mc_embed_signup > p.intern:nth-child(4)
    XPath : //*[@id='mc_embed_signup']/p[@class='intern' or starts-with(@class, 'intern ') or ' intern' = substring(@class, string-length(@class) - string-length(' intern') + 1) or contains(@class, ' intern ')][count(preceding-sibling::*) = 4 - 1]

Node name : a
      Tag : a
      CSS : #mc_embed_signup > p.intern:nth-child(4) > a:nth-child(1)
    XPath : //*[@id='mc_embed_signup']/p[@class='intern' or starts-with(@class, 'intern ') or ' intern' = substring(@class, string-length(@class) - string-length(' intern') + 1) or contains(@class, ' intern ')][count(preceding-sibling::*) = 4 - 1]/a[count(preceding-sibling::*) = 1 - 1]

Node name : a
      Tag : a
      CSS : #mc_embed_signup > p.intern:nth-child(4) > a:nth-child(2)
    XPath : //*[@id='mc_embed_signup']/p[@class='intern' or starts-with(@class, 'intern ') or ' intern' = substring(@class, string-length(@class) - string-length(' intern') + 1) or contains(@class, ' intern ')][count(preceding-sibling::*) = 4 - 1]/a[count(preceding-sibling::*) = 2 - 1]

Node name : i
      Tag : i
      CSS : #mc_embed_signup > p.intern:nth-child(4) > i
    XPath : //*[@id='mc_embed_signup']/p[@class='intern' or starts-with(@class, 'intern ') or ' intern' = substring(@class, string-length(@class) - string-length(' intern') + 1) or contains(@class, ' intern ')][count(preceding-sibling::*) = 4 - 1]/i

Node name : a
      Tag : a
      CSS : #mc_embed_signup > p.intern:nth-child(4) > a:nth-child(4)
    XPath : //*[@id='mc_embed_signup']/p[@class='intern' or starts-with(@class, 'intern ') or ' intern' = substring(@class, string-length(@class) - string-length(' intern') + 1) or contains(@class, ' intern ')][count(preceding-sibling::*) = 4 - 1]/a[count(preceding-sibling::*) = 4 - 1]

Node name : a
      Tag : a
      CSS : #mc_embed_signup > p.intern:nth-child(4) > a:nth-child(5)
    XPath : //*[@id='mc_embed_signup']/p[@class='intern' or starts-with(@class, 'intern ') or ' intern' = substring(@class, string-length(@class) - string-length(' intern') + 1) or contains(@class, ' intern ')][count(preceding-sibling::*) = 4 - 1]/a[count(preceding-sibling::*) = 5 - 1]

Node name : script
      Tag : script
      CSS : html > body > script:nth-child(3)
    XPath : //html/body/script[count(preceding-sibling::*) = 3 - 1]

Node name : script
      Tag : script
      CSS : html > body > script:nth-child(4)
    XPath : //html/body/script[count(preceding-sibling::*) = 4 - 1]

【讨论】:

  • 谢谢Abilash,我会试试这个。感谢您的回复。
  • 您好 Abhilash,感谢您的帮助。我已经尝试了代码并且它有效但实际上部分有效。我得到的示例是“html > body > div.wrap > div.text > p:nth-child(4) > a.website:nth-child(1)”,但我正在寻找类似“ /html/body/div[2]/div/p[2]/a[1]" (取自 chrome 检查)或者更准确地说,我想要 HTML 页面内每个组件或链接的相对路径。你能帮我解决这个问题吗?谢谢!
  • @NewBieDev,更新了使用 jooq 获取 xpath 的答案
  • 甜蜜!谢谢@Abhilash,让我试试这个。非常感谢您的快速回复。再次感谢!
  • @NewBieDev,你得到你想要的了吗?
猜你喜欢
  • 2013-09-11
  • 1970-01-01
  • 1970-01-01
  • 2011-01-06
  • 2015-01-02
  • 1970-01-01
  • 1970-01-01
  • 2011-03-08
  • 2017-10-22
相关资源
最近更新 更多