mirror of https://github.com/scrapy/scrapy.git
Merge pull request #4673 from elacuesta/remove-backslash
Remove backslash
This commit is contained in:
commit
b6f8693db9
|
|
@ -19,10 +19,12 @@ def _iter_command_classes(module_name):
|
|||
# scrapy.utils.spider.iter_spider_classes
|
||||
for module in walk_modules(module_name):
|
||||
for obj in vars(module).values():
|
||||
if inspect.isclass(obj) and \
|
||||
issubclass(obj, ScrapyCommand) and \
|
||||
obj.__module__ == module.__name__ and \
|
||||
not obj == ScrapyCommand:
|
||||
if (
|
||||
inspect.isclass(obj)
|
||||
and issubclass(obj, ScrapyCommand)
|
||||
and obj.__module__ == module.__name__
|
||||
and not obj == ScrapyCommand
|
||||
):
|
||||
yield obj
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -26,6 +26,8 @@ class Command(BaseRunSpiderCommand):
|
|||
else:
|
||||
self.crawler_process.start()
|
||||
|
||||
if self.crawler_process.bootstrap_failed or \
|
||||
(hasattr(self.crawler_process, 'has_exception') and self.crawler_process.has_exception):
|
||||
if (
|
||||
self.crawler_process.bootstrap_failed
|
||||
or hasattr(self.crawler_process, 'has_exception') and self.crawler_process.has_exception
|
||||
):
|
||||
self.exitcode = 1
|
||||
|
|
|
|||
|
|
@ -19,8 +19,10 @@ class Command(ScrapyCommand):
|
|||
return "Fetch a URL using the Scrapy downloader"
|
||||
|
||||
def long_desc(self):
|
||||
return "Fetch a URL using the Scrapy downloader and print its content " \
|
||||
"to stdout. You may want to use --nolog to disable logging"
|
||||
return (
|
||||
"Fetch a URL using the Scrapy downloader and print its content"
|
||||
" to stdout. You may want to use --nolog to disable logging"
|
||||
)
|
||||
|
||||
def add_options(self, parser):
|
||||
ScrapyCommand.add_options(self, parser)
|
||||
|
|
|
|||
|
|
@ -121,6 +121,7 @@ class Command(ScrapyCommand):
|
|||
|
||||
@property
|
||||
def templates_dir(self):
|
||||
_templates_base_dir = self.settings['TEMPLATES_DIR'] or \
|
||||
join(scrapy.__path__[0], 'templates')
|
||||
return join(_templates_base_dir, 'spiders')
|
||||
return join(
|
||||
self.settings['TEMPLATES_DIR'] or join(scrapy.__path__[0], 'templates'),
|
||||
'spiders'
|
||||
)
|
||||
|
|
|
|||
|
|
@ -137,6 +137,7 @@ class Command(ScrapyCommand):
|
|||
|
||||
@property
|
||||
def templates_dir(self):
|
||||
_templates_base_dir = self.settings['TEMPLATES_DIR'] or \
|
||||
join(scrapy.__path__[0], 'templates')
|
||||
return join(_templates_base_dir, 'project')
|
||||
return join(
|
||||
self.settings['TEMPLATES_DIR'] or join(scrapy.__path__[0], 'templates'),
|
||||
'project'
|
||||
)
|
||||
|
|
|
|||
|
|
@ -8,8 +8,7 @@ class Command(fetch.Command):
|
|||
return "Open URL in browser, as seen by Scrapy"
|
||||
|
||||
def long_desc(self):
|
||||
return "Fetch a URL using the Scrapy downloader and show its " \
|
||||
"contents in a browser"
|
||||
return "Fetch a URL using the Scrapy downloader and show its contents in a browser"
|
||||
|
||||
def add_options(self, parser):
|
||||
super(Command, self).add_options(parser)
|
||||
|
|
|
|||
|
|
@ -141,10 +141,12 @@ class ExecutionEngine:
|
|||
|
||||
def _needs_backout(self, spider):
|
||||
slot = self.slot
|
||||
return not self.running \
|
||||
or slot.closing \
|
||||
or self.downloader.needs_backout() \
|
||||
return (
|
||||
not self.running
|
||||
or slot.closing
|
||||
or self.downloader.needs_backout()
|
||||
or self.scraper.slot.needs_backout()
|
||||
)
|
||||
|
||||
def _next_request_from_scheduler(self, spider):
|
||||
slot = self.slot
|
||||
|
|
|
|||
|
|
@ -33,10 +33,8 @@ class BaseRedirectMiddleware:
|
|||
if ttl and redirects <= self.max_redirect_times:
|
||||
redirected.meta['redirect_times'] = redirects
|
||||
redirected.meta['redirect_ttl'] = ttl - 1
|
||||
redirected.meta['redirect_urls'] = request.meta.get('redirect_urls', []) + \
|
||||
[request.url]
|
||||
redirected.meta['redirect_reasons'] = request.meta.get('redirect_reasons', []) + \
|
||||
[reason]
|
||||
redirected.meta['redirect_urls'] = request.meta.get('redirect_urls', []) + [request.url]
|
||||
redirected.meta['redirect_reasons'] = request.meta.get('redirect_reasons', []) + [reason]
|
||||
redirected.dont_filter = request.dont_filter
|
||||
redirected.priority = request.priority + self.priority_adjust
|
||||
logger.debug("Redirecting (%(reason)s) to %(redirected)s from %(request)s",
|
||||
|
|
@ -99,8 +97,11 @@ class MetaRefreshMiddleware(BaseRedirectMiddleware):
|
|||
self._maxdelay = settings.getint('METAREFRESH_MAXDELAY')
|
||||
|
||||
def process_response(self, request, response, spider):
|
||||
if request.meta.get('dont_redirect', False) or request.method == 'HEAD' or \
|
||||
not isinstance(response, HtmlResponse):
|
||||
if (
|
||||
request.meta.get('dont_redirect', False)
|
||||
or request.method == 'HEAD'
|
||||
or not isinstance(response, HtmlResponse)
|
||||
):
|
||||
return response
|
||||
|
||||
interval, url = get_meta_refresh(response,
|
||||
|
|
|
|||
|
|
@ -60,8 +60,10 @@ class RetryMiddleware:
|
|||
return response
|
||||
|
||||
def process_exception(self, request, exception, spider):
|
||||
if isinstance(exception, self.EXCEPTIONS_TO_RETRY) \
|
||||
and not request.meta.get('dont_retry', False):
|
||||
if (
|
||||
isinstance(exception, self.EXCEPTIONS_TO_RETRY)
|
||||
and not request.meta.get('dont_retry', False)
|
||||
):
|
||||
return self._retry(request, exception, spider)
|
||||
|
||||
def _retry(self, request, reason, spider):
|
||||
|
|
|
|||
|
|
@ -81,8 +81,10 @@ class MemoryUsage:
|
|||
logger.error("Memory usage exceeded %(memusage)dM. Shutting down Scrapy...",
|
||||
{'memusage': mem}, extra={'crawler': self.crawler})
|
||||
if self.notify_mails:
|
||||
subj = "%s terminated: memory usage exceeded %dM at %s" % \
|
||||
(self.crawler.settings['BOT_NAME'], mem, socket.gethostname())
|
||||
subj = (
|
||||
"%s terminated: memory usage exceeded %dM at %s"
|
||||
% (self.crawler.settings['BOT_NAME'], mem, socket.gethostname())
|
||||
)
|
||||
self._send_report(self.notify_mails, subj)
|
||||
self.crawler.stats.set_value('memusage/limit_notified', 1)
|
||||
|
||||
|
|
@ -102,8 +104,10 @@ class MemoryUsage:
|
|||
logger.warning("Memory usage reached %(memusage)dM",
|
||||
{'memusage': mem}, extra={'crawler': self.crawler})
|
||||
if self.notify_mails:
|
||||
subj = "%s warning: memory usage reached %dM at %s" % \
|
||||
(self.crawler.settings['BOT_NAME'], mem, socket.gethostname())
|
||||
subj = (
|
||||
"%s warning: memory usage reached %dM at %s"
|
||||
% (self.crawler.settings['BOT_NAME'], mem, socket.gethostname())
|
||||
)
|
||||
self._send_report(self.notify_mails, subj)
|
||||
self.crawler.stats.set_value('memusage/warning_notified', 1)
|
||||
self.warned = True
|
||||
|
|
|
|||
|
|
@ -205,8 +205,7 @@ def _get_clickable(clickdata, form):
|
|||
|
||||
# We didn't find it, so now we build an XPath expression out of the other
|
||||
# arguments, because they can be used as such
|
||||
xpath = u'.//*' + \
|
||||
u''.join(u'[@%s="%s"]' % c for c in clickdata.items())
|
||||
xpath = u'.//*' + u''.join(u'[@%s="%s"]' % c for c in clickdata.items())
|
||||
el = form.xpath(xpath)
|
||||
if len(el) == 1:
|
||||
return (el[0].get('name'), el[0].get('value') or '')
|
||||
|
|
|
|||
|
|
@ -62,8 +62,11 @@ class TextResponse(Response):
|
|||
return self._declared_encoding() or self._body_inferred_encoding()
|
||||
|
||||
def _declared_encoding(self):
|
||||
return self._encoding or self._headers_encoding() \
|
||||
return (
|
||||
self._encoding
|
||||
or self._headers_encoding()
|
||||
or self._body_declared_encoding()
|
||||
)
|
||||
|
||||
def body_as_unicode(self):
|
||||
"""Return body as unicode"""
|
||||
|
|
|
|||
|
|
@ -21,12 +21,18 @@ class Link:
|
|||
self.nofollow = nofollow
|
||||
|
||||
def __eq__(self, other):
|
||||
return self.url == other.url and self.text == other.text and \
|
||||
self.fragment == other.fragment and self.nofollow == other.nofollow
|
||||
return (
|
||||
self.url == other.url
|
||||
and self.text == other.text
|
||||
and self.fragment == other.fragment
|
||||
and self.nofollow == other.nofollow
|
||||
)
|
||||
|
||||
def __hash__(self):
|
||||
return hash(self.url) ^ hash(self.text) ^ hash(self.fragment) ^ hash(self.nofollow)
|
||||
|
||||
def __repr__(self):
|
||||
return 'Link(url=%r, text=%r, fragment=%r, nofollow=%r)' % \
|
||||
(self.url, self.text, self.fragment, self.nofollow)
|
||||
return (
|
||||
'Link(url=%r, text=%r, fragment=%r, nofollow=%r)'
|
||||
% (self.url, self.text, self.fragment, self.nofollow)
|
||||
)
|
||||
|
|
|
|||
|
|
@ -52,8 +52,7 @@ class SettingsAttribute:
|
|||
self.priority = priority
|
||||
|
||||
def __str__(self):
|
||||
return "<SettingsAttribute value={self.value!r} " \
|
||||
"priority={self.priority}>".format(self=self)
|
||||
return "<SettingsAttribute value={self.value!r} priority={self.priority}>".format(self=self)
|
||||
|
||||
__repr__ = __str__
|
||||
|
||||
|
|
|
|||
|
|
@ -28,8 +28,7 @@ class Root(Resource):
|
|||
|
||||
|
||||
def _getarg(request, name, default=None, type=str):
|
||||
return type(request.args[name][0]) \
|
||||
if name in request.args else default
|
||||
return type(request.args[name][0]) if name in request.args else default
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
|
|
|||
|
|
@ -101,11 +101,13 @@ def get_config(use_closest=True):
|
|||
|
||||
|
||||
def get_sources(use_closest=True):
|
||||
xdg_config_home = os.environ.get('XDG_CONFIG_HOME') or \
|
||||
os.path.expanduser('~/.config')
|
||||
sources = ['/etc/scrapy.cfg', r'c:\scrapy\scrapy.cfg',
|
||||
xdg_config_home + '/scrapy.cfg',
|
||||
os.path.expanduser('~/.scrapy.cfg')]
|
||||
xdg_config_home = os.environ.get('XDG_CONFIG_HOME') or os.path.expanduser('~/.config')
|
||||
sources = [
|
||||
'/etc/scrapy.cfg',
|
||||
r'c:\scrapy\scrapy.cfg',
|
||||
xdg_config_home + '/scrapy.cfg',
|
||||
os.path.expanduser('~/.scrapy.cfg'),
|
||||
]
|
||||
if use_closest:
|
||||
sources.append(closest_scrapy_cfg())
|
||||
return sources
|
||||
|
|
|
|||
|
|
@ -9,8 +9,7 @@ from w3lib.http import basic_auth_header
|
|||
|
||||
class CurlParser(argparse.ArgumentParser):
|
||||
def error(self, message):
|
||||
error_msg = \
|
||||
'There was an error parsing the curl command: {}'.format(message)
|
||||
error_msg = 'There was an error parsing the curl command: {}'.format(message)
|
||||
raise ValueError(error_msg)
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -18,8 +18,7 @@ def install_shutdown_handlers(function, override_sigint=True):
|
|||
from twisted.internet import reactor
|
||||
reactor._handleSignals()
|
||||
signal.signal(signal.SIGTERM, function)
|
||||
if signal.getsignal(signal.SIGINT) == signal.default_int_handler or \
|
||||
override_sigint:
|
||||
if signal.getsignal(signal.SIGINT) == signal.default_int_handler or override_sigint:
|
||||
signal.signal(signal.SIGINT, function)
|
||||
# Catch Ctrl-Break in windows
|
||||
if hasattr(signal, 'SIGBREAK'):
|
||||
|
|
|
|||
|
|
@ -47,13 +47,17 @@ def response_httprepr(response):
|
|||
is provided only for reference, since it's not the exact stream of bytes
|
||||
that was received (that's not exposed by Twisted).
|
||||
"""
|
||||
s = b"HTTP/1.1 " + to_bytes(str(response.status)) + b" " + \
|
||||
to_bytes(http.RESPONSES.get(response.status, b'')) + b"\r\n"
|
||||
values = [
|
||||
b"HTTP/1.1 ",
|
||||
to_bytes(str(response.status)),
|
||||
b" ",
|
||||
to_bytes(http.RESPONSES.get(response.status, b'')),
|
||||
b"\r\n",
|
||||
]
|
||||
if response.headers:
|
||||
s += response.headers.to_string() + b"\r\n"
|
||||
s += b"\r\n"
|
||||
s += response.body
|
||||
return s
|
||||
values.extend([response.headers.to_string(), b"\r\n"])
|
||||
values.extend([b"\r\n", response.body])
|
||||
return b"".join(values)
|
||||
|
||||
|
||||
def open_in_browser(response, _openfunc=webbrowser.open):
|
||||
|
|
|
|||
|
|
@ -34,10 +34,12 @@ def iter_spider_classes(module):
|
|||
from scrapy.spiders import Spider
|
||||
|
||||
for obj in vars(module).values():
|
||||
if inspect.isclass(obj) and \
|
||||
issubclass(obj, Spider) and \
|
||||
obj.__module__ == module.__name__ and \
|
||||
getattr(obj, 'name', None):
|
||||
if (
|
||||
inspect.isclass(obj)
|
||||
and issubclass(obj, Spider)
|
||||
and obj.__module__ == module.__name__
|
||||
and getattr(obj, 'name', None)
|
||||
):
|
||||
yield obj
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -5,8 +5,7 @@ from gzip import GzipFile
|
|||
|
||||
from scrapy.spiders import Spider
|
||||
from scrapy.http import Response, Request, HtmlResponse
|
||||
from scrapy.downloadermiddlewares.httpcompression import HttpCompressionMiddleware, \
|
||||
ACCEPTED_ENCODINGS
|
||||
from scrapy.downloadermiddlewares.httpcompression import HttpCompressionMiddleware, ACCEPTED_ENCODINGS
|
||||
from scrapy.responsetypes import responsetypes
|
||||
from scrapy.utils.gz import gunzip
|
||||
from tests import tests_datadir
|
||||
|
|
|
|||
|
|
@ -77,12 +77,9 @@ class RedirectMiddlewareTest(unittest.TestCase):
|
|||
assert isinstance(req2, Request)
|
||||
self.assertEqual(req2.url, url2)
|
||||
self.assertEqual(req2.method, 'GET')
|
||||
assert 'Content-Type' not in req2.headers, \
|
||||
"Content-Type header must not be present in redirected request"
|
||||
assert 'Content-Length' not in req2.headers, \
|
||||
"Content-Length header must not be present in redirected request"
|
||||
assert not req2.body, \
|
||||
"Redirected body must be empty, not '%s'" % req2.body
|
||||
assert 'Content-Type' not in req2.headers, "Content-Type header must not be present in redirected request"
|
||||
assert 'Content-Length' not in req2.headers, "Content-Length header must not be present in redirected request"
|
||||
assert not req2.body, "Redirected body must be empty, not '%s'" % req2.body
|
||||
|
||||
# response without Location header but with status code is 3XX should be ignored
|
||||
del rsp.headers['Location']
|
||||
|
|
@ -244,12 +241,9 @@ class MetaRefreshMiddlewareTest(unittest.TestCase):
|
|||
assert isinstance(req2, Request)
|
||||
self.assertEqual(req2.url, 'http://example.org/newpage')
|
||||
self.assertEqual(req2.method, 'GET')
|
||||
assert 'Content-Type' not in req2.headers, \
|
||||
"Content-Type header must not be present in redirected request"
|
||||
assert 'Content-Length' not in req2.headers, \
|
||||
"Content-Length header must not be present in redirected request"
|
||||
assert not req2.body, \
|
||||
"Redirected body must be empty, not '%s'" % req2.body
|
||||
assert 'Content-Type' not in req2.headers, "Content-Type header must not be present in redirected request"
|
||||
assert 'Content-Length' not in req2.headers, "Content-Length header must not be present in redirected request"
|
||||
assert not req2.body, "Redirected body must be empty, not '%s'" % req2.body
|
||||
|
||||
def test_max_redirect_times(self):
|
||||
self.mw.max_redirect_times = 1
|
||||
|
|
|
|||
|
|
@ -88,8 +88,7 @@ class SelectorTestCase(unittest.TestCase):
|
|||
"""Check that classes are using slots and are weak-referenceable"""
|
||||
x = Selector(text='')
|
||||
weakref.ref(x)
|
||||
assert not hasattr(x, '__dict__'), "%s does not use __slots__" % \
|
||||
x.__class__.__name__
|
||||
assert not hasattr(x, '__dict__'), "%s does not use __slots__" % x.__class__.__name__
|
||||
|
||||
def test_selector_bad_args(self):
|
||||
with self.assertRaisesRegex(ValueError, 'received both response and text'):
|
||||
|
|
|
|||
|
|
@ -86,8 +86,7 @@ class BaseSettingsTest(unittest.TestCase):
|
|||
|
||||
def test_set_calls_settings_attributes_methods_on_update(self):
|
||||
attr = SettingsAttribute('value', 10)
|
||||
with mock.patch.object(attr, '__setattr__') as mock_setattr, \
|
||||
mock.patch.object(attr, 'set') as mock_set:
|
||||
with mock.patch.object(attr, '__setattr__') as mock_setattr, mock.patch.object(attr, 'set') as mock_set:
|
||||
|
||||
self.settings.attributes = {'TEST_OPTION': attr}
|
||||
|
||||
|
|
|
|||
|
|
@ -11,8 +11,14 @@ from scrapy import signals
|
|||
from scrapy.settings import Settings
|
||||
from scrapy.http import Request, Response, TextResponse, XmlResponse, HtmlResponse
|
||||
from scrapy.spiders.init import InitSpider
|
||||
from scrapy.spiders import Spider, CrawlSpider, Rule, XMLFeedSpider, \
|
||||
CSVFeedSpider, SitemapSpider
|
||||
from scrapy.spiders import (
|
||||
CSVFeedSpider,
|
||||
CrawlSpider,
|
||||
Rule,
|
||||
SitemapSpider,
|
||||
Spider,
|
||||
XMLFeedSpider,
|
||||
)
|
||||
from scrapy.linkextractors import LinkExtractor
|
||||
from scrapy.exceptions import ScrapyDeprecationWarning
|
||||
from scrapy.utils.test import get_crawler
|
||||
|
|
|
|||
|
|
@ -6,16 +6,28 @@ from scrapy.http import Response, Request
|
|||
from scrapy.settings import Settings
|
||||
from scrapy.spiders import Spider
|
||||
from scrapy.downloadermiddlewares.redirect import RedirectMiddleware
|
||||
from scrapy.spidermiddlewares.referer import RefererMiddleware, \
|
||||
POLICY_NO_REFERRER, POLICY_NO_REFERRER_WHEN_DOWNGRADE, \
|
||||
POLICY_SAME_ORIGIN, POLICY_ORIGIN, POLICY_ORIGIN_WHEN_CROSS_ORIGIN, \
|
||||
POLICY_SCRAPY_DEFAULT, POLICY_UNSAFE_URL, \
|
||||
POLICY_STRICT_ORIGIN, POLICY_STRICT_ORIGIN_WHEN_CROSS_ORIGIN, \
|
||||
DefaultReferrerPolicy, \
|
||||
NoReferrerPolicy, NoReferrerWhenDowngradePolicy, \
|
||||
OriginWhenCrossOriginPolicy, OriginPolicy, \
|
||||
StrictOriginWhenCrossOriginPolicy, StrictOriginPolicy, \
|
||||
SameOriginPolicy, UnsafeUrlPolicy, ReferrerPolicy
|
||||
from scrapy.spidermiddlewares.referer import (
|
||||
DefaultReferrerPolicy,
|
||||
NoReferrerPolicy,
|
||||
NoReferrerWhenDowngradePolicy,
|
||||
OriginPolicy,
|
||||
OriginWhenCrossOriginPolicy,
|
||||
POLICY_NO_REFERRER,
|
||||
POLICY_NO_REFERRER_WHEN_DOWNGRADE,
|
||||
POLICY_ORIGIN,
|
||||
POLICY_ORIGIN_WHEN_CROSS_ORIGIN,
|
||||
POLICY_SAME_ORIGIN,
|
||||
POLICY_SCRAPY_DEFAULT,
|
||||
POLICY_STRICT_ORIGIN,
|
||||
POLICY_STRICT_ORIGIN_WHEN_CROSS_ORIGIN,
|
||||
POLICY_UNSAFE_URL,
|
||||
RefererMiddleware,
|
||||
ReferrerPolicy,
|
||||
SameOriginPolicy,
|
||||
StrictOriginPolicy,
|
||||
StrictOriginWhenCrossOriginPolicy,
|
||||
UnsafeUrlPolicy,
|
||||
)
|
||||
|
||||
|
||||
class TestRefererMiddleware(TestCase):
|
||||
|
|
|
|||
|
|
@ -29,8 +29,7 @@ class CurlToRequestKwargsTest(unittest.TestCase):
|
|||
self._test_command(curl_command, expected_result)
|
||||
|
||||
def test_get_basic_auth(self):
|
||||
curl_command = 'curl "https://api.test.com/" -u ' \
|
||||
'"some_username:some_password"'
|
||||
curl_command = 'curl "https://api.test.com/" -u "some_username:some_password"'
|
||||
expected_result = {
|
||||
"method": "GET",
|
||||
"url": "https://api.test.com/",
|
||||
|
|
@ -212,8 +211,7 @@ class CurlToRequestKwargsTest(unittest.TestCase):
|
|||
with warnings.catch_warnings(): # avoid warning when executing tests
|
||||
warnings.simplefilter('ignore')
|
||||
curl_command = 'curl --bar --baz http://www.example.com'
|
||||
expected_result = \
|
||||
{"method": "GET", "url": "http://www.example.com"}
|
||||
expected_result = {"method": "GET", "url": "http://www.example.com"}
|
||||
self.assertEqual(curl_to_request_kwargs(curl_command), expected_result)
|
||||
|
||||
# case 2: ignore_unknown_options=False (raise exception):
|
||||
|
|
|
|||
|
|
@ -2,8 +2,13 @@ from twisted.trial import unittest
|
|||
from twisted.internet import reactor, defer
|
||||
from twisted.python.failure import Failure
|
||||
|
||||
from scrapy.utils.defer import mustbe_deferred, process_chain, \
|
||||
process_chain_both, process_parallel, iter_errback
|
||||
from scrapy.utils.defer import (
|
||||
iter_errback,
|
||||
mustbe_deferred,
|
||||
process_chain,
|
||||
process_chain_both,
|
||||
process_parallel,
|
||||
)
|
||||
|
||||
|
||||
class MustbeDeferredTest(unittest.TestCase):
|
||||
|
|
|
|||
|
|
@ -15,18 +15,20 @@ class XmliterTestCase(unittest.TestCase):
|
|||
xmliter = staticmethod(xmliter)
|
||||
|
||||
def test_xmliter(self):
|
||||
body = b"""<?xml version="1.0" encoding="UTF-8"?>\
|
||||
body = b"""
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<products xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:noNamespaceSchemaLocation="someschmea.xsd">\
|
||||
<product id="001">\
|
||||
<type>Type 1</type>\
|
||||
<name>Name 1</name>\
|
||||
</product>\
|
||||
<product id="002">\
|
||||
<type>Type 2</type>\
|
||||
<name>Name 2</name>\
|
||||
</product>\
|
||||
</products>"""
|
||||
xsi:noNamespaceSchemaLocation="someschmea.xsd">
|
||||
<product id="001">
|
||||
<type>Type 1</type>
|
||||
<name>Name 1</name>
|
||||
</product>
|
||||
<product id="002">
|
||||
<type>Type 2</type>
|
||||
<name>Name 2</name>
|
||||
</product>
|
||||
</products>
|
||||
"""
|
||||
|
||||
response = XmlResponse(url="http://example.com", body=body)
|
||||
attrs = []
|
||||
|
|
@ -115,7 +117,7 @@ class XmliterTestCase(unittest.TestCase):
|
|||
[[u'one'], [u'two']])
|
||||
|
||||
def test_xmliter_namespaces(self):
|
||||
body = b"""\
|
||||
body = b"""
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<rss version="2.0" xmlns:g="http://base.google.com/ns/1.0">
|
||||
<channel>
|
||||
|
|
@ -185,7 +187,7 @@ class LxmlXmliterTestCase(XmliterTestCase):
|
|||
xmliter = staticmethod(xmliter_lxml)
|
||||
|
||||
def test_xmliter_iterate_namespace(self):
|
||||
body = b"""\
|
||||
body = b"""
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<rss version="2.0" xmlns="http://base.google.com/ns/1.0">
|
||||
<channel>
|
||||
|
|
@ -214,7 +216,7 @@ class LxmlXmliterTestCase(XmliterTestCase):
|
|||
self.assertEqual(node.xpath('text()').getall(), ['http://www.mydummycompany.com/images/item2.jpg'])
|
||||
|
||||
def test_xmliter_namespaces_prefix(self):
|
||||
body = b"""\
|
||||
body = b"""
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<root>
|
||||
<h:table xmlns:h="http://www.w3.org/TR/html4/">
|
||||
|
|
|
|||
|
|
@ -1,7 +1,11 @@
|
|||
import unittest
|
||||
from scrapy.http import Request
|
||||
from scrapy.utils.request import request_fingerprint, _fingerprint_cache, \
|
||||
request_authenticate, request_httprepr
|
||||
from scrapy.utils.request import (
|
||||
_fingerprint_cache,
|
||||
request_authenticate,
|
||||
request_fingerprint,
|
||||
request_httprepr,
|
||||
)
|
||||
|
||||
|
||||
class UtilsRequestTest(unittest.TestCase):
|
||||
|
|
|
|||
|
|
@ -37,8 +37,7 @@ class ResponseUtilsTest(unittest.TestCase):
|
|||
self.assertIn(b'<base href="' + to_bytes(url) + b'">', bbody)
|
||||
return True
|
||||
response = HtmlResponse(url, body=body)
|
||||
assert open_in_browser(response, _openfunc=browser_open), \
|
||||
"Browser not called"
|
||||
assert open_in_browser(response, _openfunc=browser_open), "Browser not called"
|
||||
|
||||
resp = Response(url, body=body)
|
||||
self.assertRaises(TypeError, open_in_browser, resp, debug=True)
|
||||
|
|
|
|||
|
|
@ -156,8 +156,7 @@ Disallow: /forum/active/
|
|||
|
||||
def test_sitemap_blanklines(self):
|
||||
"""Assert we can deal with starting blank lines before <xml> tag"""
|
||||
s = Sitemap(b"""\
|
||||
|
||||
s = Sitemap(b"""
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
||||
|
||||
|
|
|
|||
|
|
@ -207,8 +207,7 @@ def create_guess_scheme_t(args):
|
|||
def do_expected(self):
|
||||
url = guess_scheme(args[0])
|
||||
assert url.startswith(args[1]), \
|
||||
'Wrong scheme guessed: for `%s` got `%s`, expected `%s...`' % (
|
||||
args[0], url, args[1])
|
||||
'Wrong scheme guessed: for `%s` got `%s`, expected `%s...`' % (args[0], url, args[1])
|
||||
return do_expected
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -356,9 +356,8 @@ class WebClientTestCase(unittest.TestCase):
|
|||
""" Test that non-standart body encoding matches
|
||||
Content-Encoding header """
|
||||
body = b'\xd0\x81\xd1\x8e\xd0\xaf'
|
||||
return getPage(
|
||||
self.getURL('encoding'), body=body, response_transform=lambda r: r)\
|
||||
.addCallback(self._check_Encoding, body)
|
||||
dfd = getPage(self.getURL('encoding'), body=body, response_transform=lambda r: r)
|
||||
return dfd.addCallback(self._check_Encoding, body)
|
||||
|
||||
def _check_Encoding(self, response, original_body):
|
||||
content_encoding = to_unicode(response.headers[b'Content-Encoding'])
|
||||
|
|
|
|||
Loading…
Reference in New Issue