蜘蛛没有刮到适量的物品

时间:2015-02-03 22:14:53

标签: python xpath css-selectors web-scraping scrapy

过去几天我一直在学习Scrapy,而且我在获取页面上的所有列表元素方面遇到了麻烦。

因此该页面具有类似的结构:

<ol class="list-results">
    <li class="SomeClass i">
        <ul>
            <li class="name">Name1</li>
        </ul>
    </li>
    <li class="SomeClass 0">
        <ul>
            <li class="name">Name2</li>
        </ul>
    </li>
    <li class="SomeClass i">
        <ul>
            <li class="name">Name3/li>
        </ul>
    </li>
</ol>

在Scrapy的Parse函数中,我获得了所有列表元素:

def parse(self, response):
        sel = Selector(response)
        all_elements = sel.css('.SomeClass')
        print len(all_elemts)

我知道在我请求的测试页面上有大约300个列表元素,但是在打印len(all_elements)之后,我只得到 61

我尝试过使用xpaths:

sel.xpath("//*[contains(concat(' ', @class, ' '), 'SomeClass')]")

然而我仍然得到61个元素而不是我应该的300个元素。

此外,我正在使用尝试和除了爪子,以防一个元素给我一个例外。

这是我要抓的实际页面: https://search.msu.edu/people/index.php?fst=ab&lst=&nid=&filter=

请理解,我这样做只是为了练习!

请帮忙!谢谢!我只是不知道还能做什么!

1 个答案:

答案 0 :(得分:2)

我担心你正在处理一个非格式化且破坏的HTML ,其中Scrapy(以及底层lxml)无法可靠地解析。例如,请在div代码中看到此未公开的li

<li class="unit"><span>Unit:</span> 
    <div class="unit-block"> Language Program                  
</li>

我转而使用BeautifulSoup手动解析HTML。换句话说,继续使用Scrapy框架的所有其他部分和组件,但HTML解析部分留给BeautifulSoup

来自scrapy shell

的演示
$ scrapy shell "https://search.msu.edu/people/index.php?fst=ab&lst=&nid=&filter="
In [1]: len(response.css('li.student'))
Out[1]: 55

In [2]: from bs4 import BeautifulSoup

In [3]: soup = BeautifulSoup(response.body)

In [4]: len(soup.select('li.student'))
Out[4]: 281

如果您使用CrawlSpider且需要基于LinkExtractor的{​​{1}},请参阅: