diff --git a/newspaper/extractors.py b/newspaper/extractors.py index d1caada0..7b4b74b3 100644 --- a/newspaper/extractors.py +++ b/newspaper/extractors.py @@ -254,12 +254,19 @@ def get_title(self, doc): """ title = '' title_element = self.parser.getElementsByTag(doc, tag='title') - # no title found - if title_element is None or len(title_element) == 0: - return title + title_text_fb = ( + self.get_meta_content(doc, 'meta[property="og:title"]') or + self.get_meta_content(doc, 'meta[name="og:title"]') or '' + ) - # title elem found - title_text = self.parser.getText(title_element[0]) + # no title found, fallback to og:title + if title_element is None or len(title_element) == 0: + title_text = title_text_fb + if not title_text: + return title + else: + # title elem found + title_text = self.parser.getText(title_element[0]) used_delimeter = False # title from h1 @@ -281,11 +288,6 @@ def get_title(self, doc): # clean double spaces title_text_h1 = ' '.join([x for x in title_text_h1.split() if x]) - # title from og:title - title_text_fb = ( - self.get_meta_content(doc, 'meta[property="og:title"]') or - self.get_meta_content(doc, 'meta[name="og:title"]') or '') - # create filtered versions of title_text, title_text_h1, title_text_fb # for finer comparison filter_regex = re.compile(r'[^\u4e00-\u9fa5a-zA-Z0-9\ ]') diff --git a/tests/unit_tests.py b/tests/unit_tests.py index 1e867d33..56583171 100644 --- a/tests/unit_tests.py +++ b/tests/unit_tests.py @@ -375,6 +375,10 @@ def test_get_title_quotes(self): html = '{}'.format(title) self.assertEqual(self._get_title(html), title) + def test_get_title_fallback_to_og_title_when_title_missing(self): + html = '' + self.assertEqual(self._get_title(html), 'Fallback title from og') + def _get_canonical_link(self, article_url, html): doc = self.parser.fromstring(html) return self.extractor.get_canonical_link(article_url, doc)