如何使用python将维基百科页面分割成段落?



我使用Python wikipedia库来提取wikipedia页面的内容。我想处理这个内容的每一段(例如计算每一段的字数)。把维基百科的内容分成段落的最好方法是什么?

import wikipedia as wikipedia
def getPage(title):
content = wikipedia.page(title).content
#for each paragraph in content do: 
#...

方式不好

维基百科库不提供此类信息。

在这个例子中,您可以看到返回的页面内容不包含大多数布局元素:

import wikipedia
print(wikipedia.page("New York City").content)

"[…和运动。纽约是联合国总部所在地,是重要的国际外交中心。位于世界上最大的天然港口之一,[…]">

当然有它们的提示,但这些解析起来很繁琐:

  • 像上面这样的段落分割在前一段的最后一个句号之后没有空格;
  • 标题使用== MyTitle ==n;
  • 打印换行符

已定义维基百科章节

如果您正在寻找已定义的节,请尝试wikipediaapi库,它更活跃,更完整。

有了它,您可以很容易地获得部分:

import wikipediaapi
page_py = wikipediaapi.Wikipedia('en').page('New_York_City')
print(page_py.sections[0].text)

" 1664年,这座城市以约克公爵的名字命名,[…]从荷兰人手中夺取的。">

这种方法给你非常干净的文本,但没有办法在节中识别段落。


Html段落然而,如果你正在寻找定义为<p>...</p>的段落,你需要解析html并做一些清理。

有一种方法可以做到这一点(使用BeautifulSoup4):

import bs4
import requests
import unicodedata
import re
def get_paragraphs(page_name):
r = requests.get('https://en.wikipedia.org/api/rest_v1/page/html/{0}'.format(page_name))
soup = bs4.BeautifulSoup(r.content)
html_paragraphs = soup.find_all('p')
for p in html_paragraphs:
cleaned_text = re.sub('([[0-9]+])', '', unicodedata.normalize('NFKD', p.text)).strip()
if cleaned_text:
yield cleaned_text
print(list(get_paragraphs('New_York_City'))[0])

"纽约市(NYC),通常简称纽约,是美国人口最多的城市。[…纽约是联合国总部所在地,也是重要的国际外交中心。

这种方法可能是最好的,尽管清理并不完美。