diff --git a/docs/topics/selectors.rst b/docs/topics/selectors.rst index 33958cee5..f8a9b0410 100644 --- a/docs/topics/selectors.rst +++ b/docs/topics/selectors.rst @@ -149,6 +149,11 @@ It returns ``None`` if no element was found: >>> sel.xpath('//div/[id="not-exists"]/text()').extract_first() is None True +A default return value can be provided as an argument, to be used instead of ``None``: + + >>> sel.xpath('//div/[id="not-exists"]/text()').extract_first(default='not-found') + 'not-found' + Notice that CSS selectors can select text or attribute nodes using CSS3 pseudo-elements:: diff --git a/scrapy/selector/unified.py b/scrapy/selector/unified.py index db8b0bc2d..efb51b561 100644 --- a/scrapy/selector/unified.py +++ b/scrapy/selector/unified.py @@ -184,7 +184,9 @@ class SelectorList(list): def extract_first(self, default=None): for x in self: - return x.extract() or default + return x.extract() + else: + return default @deprecated(use_instead='.extract()') def extract_unquoted(self): diff --git a/tests/test_selector.py b/tests/test_selector.py index 9b8613319..985424645 100644 --- a/tests/test_selector.py +++ b/tests/test_selector.py @@ -72,6 +72,14 @@ class SelectorTestCase(unittest.TestCase): self.assertEqual(sel.xpath('/ul/li[@id="doesnt-exist"]/text()').extract_first(), None) + def test_extract_first_default(self): + """Test if extract_first() returns default value when no results found""" + body = '