Я новичок в python, поэтому, пожалуйста, наберитесь терпения. Мне нужно просканировать веб-сайт (интернет-магазин), чтобы получить дерево категорий, что подразумевает навигацию по дереву страниц, а также сохранение родителей текущего под-под- ...-category для создания чистой структуры категорий. Поэтому, пожалуйста, представьте, как интернет-магазин будет вести учет своих категорий товаров.
В основном мне нужно получить элементы со строками, разделенными запятыми, с узлами дерева, как показано ниже:
MainCateg1
MainCateg1, MainCateg1Sub1
MainCateg1, MainCateg1Sub1, MainCateg1Sub1Sub1
MainCateg1, MainCateg1Sub1, MainCateg1Sub1Sub1, MainCateg1Sub1Sub1Sub1
MainCateg1, MainCateg1Sub1, MainCateg1Sub1Sub1, MainCateg1Sub1Sub1Sub2
...
MainCateg1, MainCateg1Sub2,
MainCateg1, MainCateg1Sub2, MainCateg1Sub1Sub1, MainCateg1Sub1Sub1Sub1
...
MainCateg2
MainCateg2, MainCateg2Sub1
MainCateg2, MainCateg2Sub1, MainCateg2Sub1Sub1
MainCateg2, MainCateg2Sub1, MainCateg2Sub1Sub1, MainCateg2Sub1Sub1Sub1
...
and so on...
Количество уровней подкатегорий является переменным и неизвестным. Я не знаю, как к этому подойти, потому что, казалось бы, мне придется рекурсивно вызывать скрипт, сохраняя запись предыдущих уровней в фактическом порядке появления. Я могу получить категории из меню, которое является ul с
идентификатор = "кошка"
и соответствующие подкатегории из div с
класс = «блокировать многоуровневое содержимое»
Итак, мой скрипт пока выглядит так:
import logging
from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector
from products.items import Categories
import urlparse
from scrapy.http.request import Request
class CategoriesSpider(BaseSpider):
name = "categories"
allowed_domains = ["myshop.com"]
start_urls = ['http://www.myshop.com/']
def parse(self,response):
hxs = HtmlXPathSelector(response)
listings = hxs.select('//ul[@id="cat"]/li')
links = []
#scrap listings page to get listing links
for listing in listings:
link=listing.select('.//a/@href').extract()[0]
#parse listing url to get content of the listing page
for link in links:
item=Categories()
item['link']=link
yield Request(urlparse.urljoin(response.url, link), meta={'item':item},callback=self.parse_listing_page)
#get next button link
next_page = hxs.select('//a/@href/text()').extract()[0]
if next_page:
yield Request(urlparse.urljoin(response.url, next_page), self.parse)
#scrap listing page to get content
def parse_listing_page(self,response):
hxs = HtmlXPathSelector(response)
listings = hxs.select('//div[@class="block-layered-content"]/ul/li')
item = response.request.meta['item']
logging.log(logging.WARNING, response)
yield item
Но очевидно, что это неправильно. Что я делаю до сих пор, так это анализирую основные категории на главной странице, и для каждой из них я обращаюсь к странице категорий и пытаюсь получить найденный там контент (подкатегории). Но учитывая неизвестное количество подкатегорий, я не могу написать 10-15 подкатегорий... потому что во-первых: у категории может быть только одна подкатегория, а у другой категории может быть 15 под-подкатегорий. Кроме того, мне нужно иметь возможность хранить текущую «ветку» (Maincat->SubCat1->SubSubcat1->...) и возвращать только ее.
Итак, как я могу адаптировать этот сценарий к своим потребностям?
parse
вместоparse_listing_page
? - person eLRuLL   schedule 26.11.2015