解析糟糕的HTML:如何使用xpath识别边界?

3

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

我的问题是,这也使得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抓取它们之间的评论。

我研究了同级查询,但它们似乎不适用于交替边界。我还研究了xpath查询的Kayessian方法,这种方法(除了有一个很棒的名字)似乎只适用于抓取特定的div,而不是所有在锚点标签之间的div。

你有什么想法可以帮我抓取这些div吗?


一定是谷歌评论,对吧? - Josh Burgess
真的吗,西班牙亚马逊?Google也有同样的问题。不过美国亚马逊的结构不是这样的。无论如何,你有我的同情。 - Josh Burgess
@JoshBurgess,是的,似乎这是亚马逊唯一有这个问题的备选语言版本。其他的都相当合理。 - Slater Victoroff
@Slater:嘿,一些外交手段可能会有所帮助!但总的来说,是的:像亚马逊这样的公司希望被视为技术思想领袖,而2001年的Web技术并没有对他们有所帮助。他们是否维护一个工程师的Twitter账户? - halfer
@halfer他们没有这样做。 - Slater Victoroff
显示剩余4条评论
2个回答

1

我明白了!原来XPath可以进行相对属性断言。我不确定这种行为是否是期望的,但在这种情况下它确实有效!以下是XPath:

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

很好很干净,../a[@name] 基本上就是说:

向上一级,并确保在该层次结构的级别上有一个带有名称属性的 a 元素


1
  1. 这真的解决了你的问题吗?- 任何具有兄弟adiv,无论顺序或div嵌套如何?
  2. 那么它与//td/a[@name]/../div相同。
- JimmyB
@HannoBinder,这并不是一个理想的解决方案,但在技术上解决了我的问题。我不会接受它,因为我认为可能会有更好的解决方案。这只是一个解决方法,并且似乎选择器是等效的。 - Slater Victoroff

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:是<td>元素的子元素

  • [preceding-sibling::*[1][self::a/@name]]:直接在具有属性name<a>元素之前

  • [following-sibling::*[1][self::a/@name]]:直接在具有属性name<a>元素之后


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接