我使用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),通常简称纽约,是美国人口最多的城市。[…纽约是联合国总部所在地,也是重要的国际外交中心。
这种方法可能是最好的,尽管清理并不完美。