diff --git a/scrapy/contrib/linkextractors/lxmlparser.py b/scrapy/contrib/linkextractors/lxmlparser.py index 27cd0697a..1bf35501d 100644 --- a/scrapy/contrib/linkextractors/lxmlparser.py +++ b/scrapy/contrib/linkextractors/lxmlparser.py @@ -33,7 +33,7 @@ class LxmlLinkExtractor(object): for link in links: link.url = urljoin_rfc(base_url, link.url, response_encoding) link.url = safe_url_string(link.url, response_encoding) - link.text = str_to_unicode(link.text, response_encoding) + link.text = str_to_unicode(link.text, response_encoding, errors='replace') ret.append(link) return ret diff --git a/scrapy/contrib/linkextractors/sgml.py b/scrapy/contrib/linkextractors/sgml.py index 932b9eba0..8fbcb35e7 100644 --- a/scrapy/contrib/linkextractors/sgml.py +++ b/scrapy/contrib/linkextractors/sgml.py @@ -33,7 +33,7 @@ class BaseSgmlLinkExtractor(FixedSGMLParser): for link in self.links: link.url = urljoin_rfc(base_url, link.url, response_encoding) link.url = safe_url_string(link.url, response_encoding) - link.text = str_to_unicode(link.text, response_encoding) + link.text = str_to_unicode(link.text, response_encoding, errors='replace') ret.append(link) return ret diff --git a/scrapy/tests/test_contrib_linkextractors.py b/scrapy/tests/test_contrib_linkextractors.py index 9727f34ad..0a4f23814 100644 --- a/scrapy/tests/test_contrib_linkextractors.py +++ b/scrapy/tests/test_contrib_linkextractors.py @@ -51,6 +51,13 @@ class LinkExtractorTestCase(unittest.TestCase): self.assertEqual(lx.extract_links(response), [Link(url='https://noschemedomain.com/path/to/item/12.html', text='Item 12')]) + def test_link_text_wrong_encoding(self): + html = """