【问题标题】:Parsing awful HTML: How do I recognize boundaries with xpath?解析糟糕的 HTML:如何使用 xpath 识别边界?
【发布时间】:2015-08-07 11:19:38
【问题描述】:

这听起来几乎像是一个笑话,但我向你保证这是真实的生活。互联网上有一个网站,你们都用过,它不相信 css 类。一切都直接在元素的样式标签中定义。太可怕了。

但我的问题是它也使 html 非常难以解析。我必须继续的结构看起来像这样:

<td>
    <a name="<random_string>"></a>
    <div style="generic-style, used by other elements">
        <div style="similarly generic style">{some_stuff}</div>
    </div>
    <a name="<random_string>"></a>
    ...
</td>

基本上,我有这些a 标签构成了评论的边界,他们唯一的定义信息是他们名字的随机字符串。我实际上并不关心锚标签,但我想使用 xpath 获取它们之间的评论。

我研究了sibling queries,但它们似乎不太适合交替边界。我还研究了 xpath 查询的Kayessian method,它(除了有一个很棒的名字)似乎只适合抓取特定的 div,而不是锚标记之间的所有 div。

关于如何在这里获取 div 有什么想法吗?

【问题讨论】:

  • @JoshBurgess 谢谢你的慰问。猜猜是哪个网站?
  • 应该是谷歌评论吧?
  • @JoshBurgess,不,西班牙亚马逊。
  • 真的吗,西班牙亚马逊?谷歌也有同样的问题。不过,美国亚马逊的结构并非如此。无论如何,你有我的同情。
  • @JoshBurgess,是的,它似乎是唯一存在此问题的亚马逊替代语言版本。其余的都很合理。

标签: html css xpath


【解决方案1】:

如果//td/div[../a[@name]] 适合您,那么以下内容也应该可以:

//td[a/@name]/div

这样你就不需要来回走动——或者更确切地说是上下走动——。对于更具体的选择器,您可能需要尝试以下方法:

//td/div[preceding-sibling::*[1][self::a/@name]][following-sibling::*[1][self::a/@name]]

XPath 选择具有以下所有属性的div 元素:

  • td/div :是&lt;td&gt; 元素的子元素

  • [preceding-sibling::*[1][self::a/@name]] : 在 直接 之前是 &lt;a&gt; 元素具有属性 name

  • [following-sibling::*[1][self::a/@name]] : 直接 后跟&lt;a&gt; 元素具有name 属性

【讨论】:

    【解决方案2】:

    我想通了!事实证明,xpath 将允许相对属性断言。我不确定是否需要这种行为,但它恰好在这种情况下有效!这是 xpath:

    //td/div[../a[@name]]
    

    干净整洁,../a[@name] 基本上只是说:

    上一层,并确保在该层次结构中存在一个具有 name 属性的 a 元素

    【讨论】:

    • 1) 这真的能解决您的问题吗? - 任何div 与兄弟a,不考虑顺序或div 嵌套? 2) 那么就和//td/a[@name]/../div一样。
    • @HannoBinder,这不是一个理想的解决方案,但它确实在技术上为我解决了问题。我不会接受它,因为我认为可能有更好的解决方案。这是...一个恰好可以工作的解决方案,而且看起来选择器是等效的。
    猜你喜欢
    • 2014-09-07
    • 1970-01-01
    • 2012-05-06
    • 2020-05-08
    • 1970-01-01
    • 2019-11-17
    • 2023-04-01
    • 2014-07-06
    • 2020-05-26
    相关资源
    最近更新 更多