过去几天我一直在学习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=
请理解,我这样做只是为了练习!
请帮忙!谢谢!我只是不知道还能做什么!
答案 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}},请参阅: