Merge pull request #5269 from Ankur19/allow-non-text-response-types-in-ItemLoader

Fix bug #5145 - Removing Selector for Response's that are not Http or Xml
This commit is contained in:
Andrey Rahmatullin 2021-10-14 16:19:54 +05:00 committed by GitHub
commit 5b13bfd14a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 11 additions and 2 deletions

View File

@ -83,6 +83,9 @@ class ItemLoader(itemloaders.ItemLoader):
def __init__(self, item=None, selector=None, response=None, parent=None, **context):
if selector is None and response is not None:
selector = self.default_selector_class(response)
try:
selector = self.default_selector_class(response)
except AttributeError:
selector = None
context.update(response=response)
super().__init__(item=item, selector=selector, parent=parent, **context)

View File

@ -4,7 +4,7 @@ import attr
from itemadapter import ItemAdapter
from itemloaders.processors import Compose, Identity, MapCompose, TakeFirst
from scrapy.http import HtmlResponse
from scrapy.http import HtmlResponse, Response
from scrapy.item import Item, Field
from scrapy.loader import ItemLoader
from scrapy.selector import Selector
@ -304,6 +304,12 @@ class SelectortemLoaderTest(unittest.TestCase):
l.add_css('name', 'div::text')
self.assertEqual(l.get_output_value('name'), ['Marta'])
def test_init_method_with_base_response(self):
"""Selector should be None after initialization"""
response = Response("https://scrapy.org")
l = TestItemLoader(response=response)
self.assertIs(l.selector, None)
def test_init_method_with_response(self):
l = TestItemLoader(response=self.response)