2016-01-04 4 views
-4

Я хочу скопировать данные из https://www.proptiger.com/noida/knowledge-park-v/supertech-sports-village-665980.Scrapy не анализирует весь HTML-контент

Но когда команда выполнения response.xpath('//span'), она не возвращает все теги span.

И когда я выполняю response.xpath('//span[@itemprop="name"]'), он возвращает пустой массив.

>>> response.xpath('//span[@itemprop="name"]') 
[] 
+0

В документе нет элементов с атрибутом 'itemprop'. –

+0

, если контент сгенерирован JavaScript, вы не можете найти его. – furas

ответ

1

Использование scrapy shell itemprop XPath вы ищете не доступна, как сказал @furas, некоторые из содержания генерируется JavaScript. Вы можете получить этот контент, добавив Selenium для лечения. Selenium получает URL-адрес, отображает его с помощью веб-браузера, а scrapy может получить доступ к полученному HTML как обычно. Код ниже представляет собой скелет, чтобы вы начали использовать Firefox, но он работает и с другими браузерами. Я бы порекомендовал заполучить Firebug для Firefox, это полезно для практики xpaths.

import scrapy 
from scrapy import signals 
from scrapy.xlib.pydispatch import dispatcher 
from scrapy.http import TextResponse 

from selenium import webdriver 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support.wait import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC 
from selenium.common.exceptions import TimeoutException 

class SearchSpider(scrapy.Spider): 
    name = "search" 

    allowed_domains = ['www.somedomain.com'] 
    start_urls = ['https://www.somewebsite.com'] 

    def __init__(self, filename=None): 
     # wire us up to selenium 
     self.driver = webdriver.Firefox() 
     dispatcher.connect(self.spider_closed, signals.spider_closed) 

    def spider_closed(self, spider): 
     self.driver.close() 

    def parse(self, response): 
     item = someItem() 

     # Load the current page into Selenium 
     self.driver.get(response.url) 

     try: 
      WebDriverWait(self.driver, 30).until(EC.presence_of_element_located((By.XPATH, '//span[@itemprop="name"]'))) 
     except TimeoutException: 
      item['status'] = 'timed out' 

     # Sync scrapy and selenium so they agree on the page we're looking at then let scrapy take over 
     resp = TextResponse(url=self.driver.current_url, body=self.driver.page_source, encoding='utf-8') 
     # scrape as normal