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