scrapy:如何只选择可见的项目

时间:2015-11-30 15:51:49

标签: python html xpath web-scraping scrapy

我正在用scrapy写蜘蛛,我发现有些物品是css规则不可见的,但是,我只想选择可见的物品。

但是对于那些直接编写样式的<span style="display:none">来说,xpath似乎没问题,而那些样式被写成css规则的那些<style>.pigf{display:none}</style>则不行。

似乎我应该渲染css以便我可以正确地过滤掉不可见的项目,但是我怎么能渲染它呢?有没有更简单的解决方案?

示例html:

<span>
    <style>
        .pigf{display:none}.n8T-{display:inline}.pGrH{display:none}.XUYD{display:inline}.jdKj{display:none}.r7fk{display:inline}.pkO2{display:none}.EzIC{display:inline}
    </style>
    <span class="55">
        27
    </span>
    <div style="display:none">
        36
    </div>
    <span style="display:none">
        174
    </span>
    <span class="pkO2">
        174
    </span>
    <span>
    </span>
    .
    <span style="display:none">
        10
    </span>
    <span class="pkO2">
        10
    </span>
    <div style="display:none">
        10
    </div>
    <span style="display:none">
        49
    </span>
    <span class="jdKj">
        49
    </span>
    <span style="display:none">
        84
    </span>
    <span>
    </span>
    <span class="n8T-">
        115
    </span>
    <span style="display:none">
        129
    </span>
    <div style="display:none">
        129
    </div>
    <div style="display:none">
        143
    </div>
    <span style="display:none">
        151
    </span>
    <div style="display:none">
        169
    </div>
    <span>
    </span>
    .
    <span class="14">
        75
    </span>
    <span class="XUYD">
        .
    </span>
    <div style="display:none">
        23
    </div>
    <span style="display:none">
        79
    </span>
    <span style="display: inline">
        114
    </span>
</span>

1 个答案:

答案 0 :(得分:1)

为了让事情变得可靠,您需要一些东西来呈现HTML - 理想情况下是真正的浏览器。查看可用于自动化浏览器的selenium包。请注意,浏览器也可以是无头的,例如PhantomJS

selenium可以轻松distinguish visible and invisible elements。您可以使用相关的is_displayed()方法来检查可见性。另外,如果你得到一个元素的文本,根据specification,它只会返回文本的可见部分。

您还可以借助Splashscrapy-splash middleware中渲染您的网页。可以找到示例用法here