我最近一直在使用报纸图书馆。我发现的唯一问题是,当我做article.publish_date
时,我总是得到None
。
class NewsArticle:
def __init__(self,url):
self.article = Article(url)
self.article.download()
self.article.parse()
self.article.nlp()
def getKeywords(self):
x = self.article.keywords
for i in range(0,len(x)):
x[i] = x[i].encode('ascii', 'ignore')
return x
return self.article.keywords
def getSummary(self):
return self.article.summary.encode('ascii', 'ignore')
def getAuthors(self):
x = self.article.authors
for i in range(0,len(x)):
x[i] = x[i].encode('ascii', 'ignore')
return x
def thumbnail_url(self):
return self.article.top_image.encode('ascii', 'ignore')
def date_made(self):
print self.article.publish_date
return self.article.publish_date
def get_videos(self):
x=self.article.movies
for i in range(0,len(x)):
x[i] = x[i].encode('ascii', 'ignore')
return x
def get_title(self):
return self.article.title.encode('ascii','ignore')
我要讲一堆url。你可以看到我在返回publish_date
之前打印了它。
我得到我之前说过的:
None
None
None
None
None
None
None
None
None
None
None
None
None
None
None
None
None
None
None
None
None
None
None
None
None
None
None
None
None
None
None
None
None
None
None
None
None
None
None
None
None
None
None
None
None
None
None
None
None
None
None
所有其他函数都按预期工作。该站点的文档查看了一个示例
>>> article.publish_date
datetime.datetime(2013, 12, 30 0, 0)
我很确定我正在做这件事。我不确定是否有人看到了我的问题。
我百分之百确信你们在过去的5年里已经解决了这个问题,但是我想把我对报纸的了解。
这个Python库并不完美,因为它的设计是为了尽可能地获取特定元素,比如文章标题、作者姓名、出版日期和其他一些项。即使用最大的努力报纸也会错过不在其设计位置上的内容。
例如,这是从报纸的提取代码。
3 strategies for publishing date extraction. The strategies are descending in accuracy and the next strategy is only attempted if a preferred one fails.
1. Pubdate from URL
2. Pubdate from metadata
3. Raw regex searches in the HTML + added heuristics
如果newspaper确实在URL中找到了日期,它将移动到元标签,但只有这些:
PUBLISH_DATE_TAGS = [
{'attribute': 'property', 'value': 'rnews:datePublished',
'content': 'content'},
{'attribute': 'property', 'value': 'article:published_time',
'content': 'content'},
{'attribute': 'name', 'value': 'OriginalPublicationDate',
'content': 'content'},
{'attribute': 'itemprop', 'value': 'datePublished',
'content': 'datetime'},
{'attribute': 'property', 'value': 'og:published_time',
'content': 'content'},
{'attribute': 'name', 'value': 'article_date_original',
'content': 'content'},
{'attribute': 'name', 'value': 'publication_date',
'content': 'content'},
{'attribute': 'name', 'value': 'sailthru.date',
'content': 'content'},
{'attribute': 'name', 'value': 'PublishDate',
'content': 'content'},
{'attribute': 'pubdate', 'value': 'pubdate',
'content': 'datetime'},
{'attribute': 'name', 'value': 'publish_date',
'content': 'content'},
Fox news将他们的日期存储在元标记部分,但在newspaper不查询的标记中。要从Fox新闻文章中提取日期,您可以这样做:
article_meta_data = article.meta_data
article_published_date = str({value for (key, value) in article_meta_data.items() if key == 'dcterms.created'})
print(article_published_date)
{'2020-10-11T12:51:53-04:00'}
有时消息来源的发布日期在报纸没有看到的部分。当发生这种情况时,您必须在newspaper周围包装一些额外的代码来获取日期。
例如BBC将日期存储在脚本application/ld+json中。Newspaper不是用来查询或提取这个脚本的。要从BBC文章中提取日期,您可以这样做:
soup = BeautifulSoup(article.html, 'html.parser')
bbc_dictionary = json.loads("".join(soup.find("script", {"type":"application/ld+json"}).contents))
date_published = [value for (key, value) in bbc_dictionary.items() if key == 'datePublished']
print(date_published)
['2020-10-11T20:11:33.000Z']
我在GitHub上发布了一个报纸使用文档,讨论了围绕这个库的各种收集策略和其他主题。