为什么xpath只选择<ul>中的最后一个<li>?

时间:2015-05-10 05:01:00

标签: python web-scraping scrapy scrapy-spider

我试图抓住这个网站:http://www.kaymu.com.ng/

HTML I&#39;抓取的部分是这样的:

<ul id="navigation-menu">
    <li> some content </li>
    <li> some content </li>
    ...
    <li> some content </li>
</ul>

这是我的蜘蛛:

class KaymuSpider(Spider):
    name = "kaymu"
    allowed_domains = ["kaymu.com.ng"]
    start_urls = [
        "http://www.kaymu.com.ng"
    ]

    def parse(self, response):
        sel = response.selector
        menu = sel.xpath('//ul[@id="navigation-menu"]/li')

菜单中只有列表中的最后一个li元素。当语法选择所有li元素时,我不确定它为什么会这样做。请建议可能出错的地方,谢谢!

1 个答案:

答案 0 :(得分:2)

问题是菜单是在执行javascript的浏览器的帮助下动态构建的。 Scrapy不是浏览器,也没有内置的javascript引擎。

希望有一个包含javascript菜单对象数组的script标记。我们可以找到所需的script标记,提取javascript数组,在json module的帮助下将其加载到Python列表中,然后打印出菜单项名称。

来自"Scrapy Shell"

的演示
$ scrapy shell http://www.kaymu.com.ng/

In [1]: script = response.xpath("//script[contains(., 'categoryData')]/text()").extract()[0]

In [2]: import re

In [3]: pattern = re.compile(r'var categoryData = (.*?);\n')

In [4]: data = pattern.search(script).group(1)

In [5]: import json

In [6]: data = json.loads(data)

In [7]: for item in data:
   ....:     print item['name']
   ....:     
Fashion
Jewelry & Watches
Health & Beauty
Sporting Goods
Mobile Phones & Tablets
Audio, Video & Gaming
Computers, Laptops & Accessories
Appliances, Furniture & Decor
Books & Media
Babies & Kids
Food & Beverages
Other