快速入门

急于开始吗?本页面提供了如何开始使用newspaper的详细介绍。这里假设你已经安装了newspaper。如果尚未安装,请前往Installation部分。

构建新闻源

Source 对象是像CNN或ESPN这样的在线新闻媒体网站的抽象。 您可以通过两种不同的方式初始化它们。

为新闻站点构建一个Source对象将会为您提取其类别、订阅源、文章、品牌和描述。

您还可以无缝提供配置参数 例如 languagebrowser_user_agent 等。 请导航至 advanced 部分了解详情。

import newspaper
cnn_paper = newspaper.build('http://cnn.com')

other_paper = newspaper.build('http://www.lemonde.fr/', language='fr')

不过,如果需要,您可以通过使用Source对象的一些高级功能和参数,在实现中更加具体,如advanced部分所述。

从新闻源提取文章

每个新闻源都有一套近期文章,主要出现在首页和分类页面中。Source对象将提取这些文章的引用,并将其存储为Article对象列表,位于其Source.articles属性中。

以下示例假设新闻源已经初始化并构建完成。

import newspaper
cnn_paper = newspaper.build('http://cnn.com')

for article in cnn_paper.articles:
    print(article.url)

# 'http://www.cnn.com/2013/11/27/justice/tucson-arizona-captive-girls/'
# 'http://www.cnn.com/2013/12/11/us/texas-teen-dwi-wreck/index.html'
...

print(cnn_paper.size()) # cnn has 3100 articles
# 3100

文章缓存

默认情况下,newspaper会缓存所有先前提取的文章,并且不会重新下载任何已经提取过的文章

此功能旨在防止重复文章并提高提取速度。 例如,如果您对同一新闻源运行两次构建命令,第二次 它只会下载并解析新文章:

cbs_paper = newspaper.build('http://cbs.com')
cbs_paper.size()
# 1030

cbs_paper = newspaper.build('http://cbs.com')
cbs_paper.size()
# 2

cbs_paper.size()的返回值从1030变为2,因为首次抓取cbs时我们发现了1030篇文章。但在第二次抓取时,我们会排除所有已被抓取过的文章。

这意味着自我们首次提取以来,仅发布了2篇新文章。

您可以通过将memoize_articles参数设置为False来禁用此功能。

这也可以通过将Configuration对象的memoize_articles属性设置为False来实现。更多示例可在advanced部分找到。

import newspaper

cbs_paper = newspaper.build('http://cbs.com', memoize_articles=False)
cbs_paper.size()
# 1030

cbs_paper = newspaper.build('http://cbs.com', memoize_articles=False)
cbs_paper.size()
# 1030

提取来源类别

Source对象的一个重要特性是能够从新闻来源的主页提取网站类别。这样您就可以从特定类别中提取文章。

for category in cnn_paper.category_urls():
     print(category)

# 'http://lifestyle.cnn.com'
# 'http://cnn.com/world'
# 'http://tech.cnn.com'
...

提取源信息流

RSS源在新闻生态系统中扮演着重要角色。它们使得新闻能够在网络间传播和分享。Source对象将提取RSS源

for feed_url in cnn_paper.feed_urls():
    print(feed_url)

# 'http://rss.cnn.com/rss/cnn_crime.rss'
# 'http://rss.cnn.com/rss/cnn_tech.rss'
...

提取来源品牌与描述

你可以使用Source对象来提取来源网站的基础名称(例如从bbc.co.uk中提取bbc)以及从已知的元标签中提取其描述

print(cnn_paper.brand)
# 'cnn'

print(cnn_paper.description)
# 'CNN.com delivers the latest breaking news and information on the latest...'

提取单个新闻文章

文章对象是新闻文章(新闻报道)的抽象表示。 例如,一个新闻Source是CNN (cnn.com),一篇新闻文章是 包含新闻报道的特定链接,比如https://edition.cnn.com/2023/11/09/tech/… 您可以使用来自现有(且已初始化)新闻Source的任何Article 或单独使用Article对象。只需传入文章URL, 并调用Article.download()Article.parse()。 您也可以使用newspaper的快捷调用newspaper.article(), 它将为您创建Article对象, 并调用Article.download()Article.parse()

引用来自Source对象的文章:

first_article = cnn_paper.articles[0]

或者,单独初始化一个 Article 对象:

first_article = newspaper.Article(url="http://www.lemonde.fr/...", language='fr')

所有适用于Source对象的初始化参数同样适用于Article对象。 但存在一些差异。例如,title参数仅适用于Article对象。

忽略特定内容类型对于Source对象和Article对象

使用ignored_content_types_defaults参数, 可以忽略特定内容类型 对于Source对象和Article对象。此参数也可作为 Configuration对象的属性使用。

您可以提供一个内容类型及其占位符值的字典。任何具有该内容类型的文章将被忽略,占位符值将用于替代实际内容。

import newspaper
pdf_defaults = {"application/pdf": "%PDF-",
                  "application/x-pdf": "%PDF-",
                  "application/x-bzpdf": "%PDF-",
                  "application/x-gzpdf": "%PDF-"}
pdf_article = newspaper.article(url='https://www.adobe.com/pdf/pdfs/ISO32000-1PublicPatentLicense.pdf',
                                        ignored_content_types_defaults=pdf_defaults)
print(pdf_article.html)
# %PDF-

最重要的Article方法

Article提取的步骤如下:

下载文章

一个Article刚初始化时不会有html、标题或文本。你必须先调用download()。下载也可以以多线程方式进行。查看advanced部分获取更多详情。

first_article = cnn_paper.articles[0]

first_article.download()

print(first_article.html)
# '<!DOCTYPE HTML><html itemscope itemtype="http://...'

print(cnn_paper.articles[7].html)
# will fail, since article is not downloaded yet

解析文章

为了从文章中解析有意义的纯文本,提取其标题、发布日期、作者、顶部图片等,我们必须对其调用parse()。 如果在download()之前调用parse(),它将抛出ArticleException

first_article.parse()

print(first_article.text)
# 'Three sisters who were imprisoned for possibly...'

print(first_article.top_image)
# 'http://some.cdn.com/3424hfd4565sdfgdg436/

print(first_article.authors)
# ['Eliott C. McLaughlin', 'Some CoAuthor']

print(first_article.title)
# u'Police: 3 sisters imprisoned in Tucson home'

print(first_article.images)
# ['url_to_img_1', 'url_to_img_2', 'url_to_img_3', ...]

print(first_article.movies)
# ['url_to_youtube_link_1', ...] # youtube, vimeo, etc

对文章执行自然语言处理

最后,您可以处理上面获取的文本,并使用nlp()方法提取一些自然语言特征。这将填充文章的summarykeywords属性。

注意: nlp() 是一个计算成本很高的操作。建议仅在需要时使用,不建议在 Source 对象中的所有文章上运行

在调用nlp()之前,您必须已对文章调用了download()parse()

在当前版本中,nlp()功能仅支持西方语言。

first_article.nlp()

print(first_article.summary)
# '...imprisoned for possibly a constant barrage...'

print(first_article.keywords)
# ['music', 'Tucson', ... ]

print(cnn_paper.articles[100].nlp()) # fail, not been downloaded yet
# Traceback (...
# ArticleException: You must parse an article before you try to..

其他方法

以下是一些随机但希望有用的功能!hot()通过公共API返回谷歌上的热门搜索词列表。popular_urls()返回流行新闻源URL列表。以防您在选择新闻源时需要帮助!

import newspaper

newspaper.hot()
# ['Ned Vizzini', Brian Boitano', Crossword Inventor', 'Alex & Sierra', ... ]

newspaper.popular_urls()
# ['http://slate.com', 'http://cnn.com', 'http://huffingtonpost.com', ... ]