【问题标题】:Find CSS Path from JSoup Element从 JSoup 元素中查找 CSS 路径
【发布时间】:2014-11-01 15:56:19
【问题描述】:

假设我有this 网页,我正在考虑包含字符串Doe 的表的td 元素。使用 Google Chrome,我可以获得该元素的 CSS 路径

#main > table:nth-child(6) > tbody > tr:nth-child(3) > td:nth-child(3)

使用它作为 Jsoup CSS Query 返回我正在考虑的元素,如您所见 here。 Jsoup 是否可以从 Element 获取上述 CSS 路径 或者我必须手动遍历树来创建它?

我知道我可以使用 CSS 查询 :containsOwn(text) 使用 Element 自己的文本,但这也可以选择其他元素,路径只包含类、id 和 @987654329 @。

这对于在 JSoup 中编写能够提取相似元素的语义解析器非常有用。

【问题讨论】:

  • 不支持您的要求。不过,这将是一个不错的功能。
  • @alkis 现在 jsoup 支持它;)
  • +1。干得好,恩里科。

标签: css path html-parsing jsoup


【解决方案1】:

Jsoup 似乎没有提供这种开箱即用的功能。所以我编码了它:

public static String getCssPath(Element el) {
    if (el == null)
        return "";

    if (!el.id().isEmpty())
        return "#" + el.id();

    StringBuilder selector = new StringBuilder(el.tagName());
    String classes = StringUtil.join(el.classNames(), ".");
    if (!classes.isEmpty())
        selector.append('.').append(classes);

    if (el.parent() == null)
        return selector.toString();

    selector.insert(0, " > ");
    if (el.parent().select(selector.toString()).size() > 1)
        selector.append(String.format(
                ":nth-child(%d)", el.elementSiblingIndex() + 1));

    return getCssPath(el.parent()) + selector.toString();
}

我还在 Jsoup 存储库上创建了一个 issue 和一个 pull request 以使用该方法扩展 Element 类。如果需要,请在 Jsoup 中评论或订阅。

更新

我的拉取请求已合并到 jsoup 版本 1.8.1,现在 Element 类具有 cssSelector 方法,该方法返回可用于检索选择器中的元素的 CSS 路径:

获取一个唯一选择此元素的 CSS 选择器。 如果元素有ID,则返回#id;否则返回父级(如果有) CSS 选择器,后跟“>”,然后是唯一的选择器 元素(tag.class.class:nth-child(n))。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多