是否可以使用:not()选择器来定位特定的文本节点?

时间:2016-11-13 02:28:31

标签: html dom web-scraping css-selectors

考虑以下HTML:

<div class="status-date">
  <strong>Date Available:</strong> 
  10/05/2016
</div>

我希望:not()选择器能够定位日期字符串“10/05/2016”,如下所示:

.status-date *:not(strong) {
  text-decoration: underline;
}

两个问题
1. :not()选择器是否具备此功能?
2.如果没有,是任何 CSS选择器能够做到这一点吗?

上下文:这实际上与样式文本节点无关。我正在做一些网页抓取,我想在这种情况下忽略<strong>标记。如果它是关于样式的,我可以直接定位div并覆盖<strong>上的样式以“取消它”。

进一步背景:我可以看到我天真的尝试不能按预期工作。例如,如此代码中所示:http://codepen.io/anon/pen/rWezQK  但是我有可能误解了我所描述的选择器或DOM结构。

2 个答案:

答案 0 :(得分:2)

简单的选择器代表元素。对于所有简单选择器都是如此,包括*:not()。文本由元素包含,但它本身不是元素。你不会能够匹配&#34;只是带有任何CSS选择器的文本,因为就选择器而言,DOM调用的文本节点甚至不存在于文档树中。

  

规范本身在:not()选择器上只提供三行。

规范中的第一行支持:

  

否定伪类,不是(X),是一个函数符号,它将一个简单的选择器(不包括否定伪类本身)作为参数。它表示一个未被其参数表示的元素。

请注意,它表示&#34;它代表一个元素&#34;。

如果您正在进行网页抓取,请考虑使用XPath:

//div[contains(concat(' ', @class, ' '), ' status-date ')]/strong/following-sibling::text()

答案 1 :(得分:1)

默认情况下,CSS不会影响未包装在容器中的文本节点。因此,:not-selector不能做你想做的事情。如果您要抓取这样的信息,您将不得不在服务器端解析它 - 或者只是设置div strong { display: none; }查看内容 - 但这可能不会影响抓取位。 ..