我最近一直在使用newspaper库。我发现的唯一问题是当我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')
我正在浏览一堆网址。您可以看到我在返回之前打印出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)
我这样做我很确定。我不确定是否有人关注我的问题。
答案 0 :(得分:0)
我 100% 确定您在过去 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 上发布了一个 Newspaper Usage Document,讨论了围绕这个库的各种收集策略和其他主题。