Python – 蜘蛛没有刮到适量的物品

在过去的几天里,我一直在学习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=

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

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

最佳答案 我担心你正在处理一个非格式化和破坏的HTML,其中Scrapy(和底层lxml)无法可靠地解析.例如,在li标签内看到这个未闭合的div:

<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并且需要基于BeautifulSoup的LinkExtractor,请参阅:

> A scrapy link extractor that uses BeautifulSoup

点赞