从python维基百科页面输出中检索主要段落

时间:2012-04-26 13:15:57

标签: python html parsing wikipedia

有没有办法提取

  阿尔伯特·爱因斯坦(1938年3月14日至1955年4月18日),他是德国出生的理论物理学家,他发展了广义相对论,实现了物理学的革命。 ...............超过150个非科学作品。 [6] [8]他伟大的智慧和独创性使“爱因斯坦”这个词成为天才的代名词。 [9]

(主段落的整个输出,如果代码运行,则可见)

自动输出以下​​代码?即使它是从不同的维基百科页面输出:

import urllib2
import re, sys
from HTMLParser import HTMLParser

class MLStripper(HTMLParser):
    def __init__(self):
        self.reset()
        self.fed = []
    def handle_data(self, d):
        self.fed.append(d)
    def get_data(self):
        return ''.join(self.fed)

def stripHTMLTags(html):
    html = re.sub(r'<{1}br{1}>', '\n', html)
    s = MLStripper()
    s.feed(html)
    text = s.get_data()
    if "External links" in text:
        text, sep, tail = text.partition('External links')
    if "External Links" in text:
        text, sep, tail = text.partition('External Links')
    text = text = text.replace("See also","\n\n See Also - \n")
    text = text.replace("*","- ")
    text = text.replace(".", ". ")
    text = text.replace("  "," ")
    text = text.replace("""   /
 / ""","")
    return text

opener = urllib2.build_opener()
opener.addheaders = [('User-agent', 'Mozilla/5.0')]
infile = opener.open('http://en.wikipedia.org/w/index.php?title=Albert_Einstein&printable=yes')
page = infile.read()
print stripHTMLTags(page)

请原谅我糟糕的格式,代码(以及可能的缩进),我现在正在使用3“显示器,并且没有机会查看我自己的代码:P。

还要感谢那些帖子帮助我完成这项工作的人们。)

3 个答案:

答案 0 :(得分:3)

我强烈建议不要对任何网站进行html抓取。

这很痛苦,很容易破坏,很多网站所有者都不喜欢它。

使用此(python-wikitools)与Wikipedia API(从长远来看,这是您的最佳选择)进行交互。

答案 1 :(得分:1)

答案 2 :(得分:-1)

我在这里留下答案,因为它直接是OP所要求的。正确的方法是按照the answer by @ChristophD中的建议使用python-wikitools


我稍微修改了您问题中的代码以使用BeautifulSoup。存在其他选择。您可能还想尝试lxml

import urllib2
import re, sys
from HTMLParser import HTMLParser

# EDIT 1: import the packag
from BeautifulSoup import BeautifulSoup

class MLStripper(HTMLParser):
    def __init__(self):
        self.reset()
        self.fed = []
    def handle_data(self, d):
        self.fed.append(d)
    def get_data(self):
        return ''.join(self.fed)

def stripHTMLTags(html):
    html = re.sub(r'<{1}br{1}>', '\n', html)
    s = MLStripper()
    s.feed(html)
    text = s.get_data()
    if "External links" in text:
        text, sep, tail = text.partition('External links')
    if "External Links" in text:
        text, sep, tail = text.partition('External Links')
    text = text = text.replace("See also","\n\n See Also - \n")
    text = text.replace("*","- ")
    text = text.replace(".", ". ")
    text = text.replace("  "," ")
    text = text.replace("""   /
 / ""","")
    return text

opener = urllib2.build_opener()
opener.addheaders = [('User-agent', 'Mozilla/5.0')]
infile = opener.open('http://en.wikipedia.org/w/index.php?title=Albert_Einstein&printable=yes')
page = infile.read()

# EDIT 2: convert the page and extract text from the first <p> tag
soup = BeautifulSoup(page)
para = soup.findAll("p", limit=1)[0].text

print stripHTMLTags(para)