在评论之前仅刮除元素

时间:2016-11-11 07:15:40

标签: javascript jquery html web-scraping

我有一个网页,我正在抓取信息。在网页中,我需要的是在具有特定类别的单独div中。

例如:

<div class="temp">text </div>

问题在于每天有不同数量的这些div,有些日子有5个,然后可能是10个或12个。在我需要的div之后是更多同一类的div但有我不需要的信息。在html中有一条注释线将两者分开。像这样:

<div class="temp">text </div>
<div class="temp">moretext </div>
<!-- beginning of historical data -->
<div class="temp">text </div>

我目前正在使用

获取div
var temps = window._document.getElementsByClassName('temp')
for (var I = 0; I  < temps.length; i++){
var a = temps [i].getElementsByTagName('a')
var text = temps [i].textContent
//do something with vars }

这很有效,但是由于我不知道在评论之前有多少div,我不能将for循环限制为我需要的东西,要么拉出所有东西,包括我不需要的东西,如果我设置的话我要么拉得太多,要么太少。

有没有办法在评论之前拉出div?

1 个答案:

答案 0 :(得分:0)

这就是您为您提供的示例HTML所描述的内容,但它假设有趣的div元素和注释都是body元素的子元素,并且只有一个注释文档。

一般概念是查找注释标记的索引,并仅处理索引较低的div。

(另一个假设是您的浏览器是ECMA-6)

&#13;
&#13;
function doSomethingWithTemps() {
    var commentIndex = $('*').contents().filter( (i,v) => v.nodeType == 8).index();
    $('.temp').filter( (i,v) => $(v).index() < commentIndex ).each( (i,v) => console.log(v.textContent) );
}

function nonEcma6() {
    var commentIndex = $('*').contents().filter( function(i,v) { return v.nodeType == 8 } ).index();
    console.log("Index: "+commentIndex);
    $('.temp').filter( function(i,v) { return $(v).index() < commentIndex } ).each( function(i,v) { console.log(v.textContent) } );
}

$(nonEcma6);
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<body>
<div class="temp">text </div>
<div class="temp">moretext </div>
<!-- beginning of historical data -->
<div class="temp">text </div>
</body>
&#13;
&#13;
&#13;

查找评论标记的代码来自Selecting HTML Comments with jQuery