【问题标题】:Parsing Wikipedia recursively and fetch text from included links递归解析维基百科并从包含的链接中获取文本
【发布时间】:2012-09-20 03:49:35
【问题描述】:

因为我讨厌来回点击阅读维基百科文章,所以我正在尝试构建一个工具来根据以下算法创建“扩展的维基百科文章”:

  • 创建两个变量:Depth 和 Length。
  • 将维基百科文章设置为种子页面
  • 解析这篇文章:只要有指向另一篇文章的链接,就获取第一个 Length 句子并将其包含在原始文章中(例如,在括号中或以其他方式突出显示)。
  • 递归执行此操作直到某个Depth,即不超过两个级别。

结果将是一篇无需反复点击即可一口气阅读的文章...

您将如何在 Python 中构建这样的机制?应该使用哪些库(是否有用于此类任务的库)?有什么有用的教程吗?

【问题讨论】:

    标签: python parsing recursion web-scraping wikipedia


    【解决方案1】:

    您可以使用urllib2 来请求网址。为了解析 htmlpage,有一个很棒的库,叫做BeautifulSoup。您需要考虑的一件事是,在使用爬虫扫描维基百科时,您需要在请求中添加标题。否则维基百科将简单地禁止被抓取。

     request = urllib2.Request(page)
    

    添加标题

     request.add_header('User-agent', 'Mozilla/5.0 (Linux i686)')
    

    然后加载页面并将其提供给BeautifulSoup。

     soup = BeautifulSoup(response)  
     text = soup.get_text()
    

    这将为您提供页面中的链接

     for url in soup.find_all('a',attrs={'href': re.compile("^http://")}):  
           link = url['href']
    

    现在关于爬取维基百科的算法,你想要的是一个叫做Depth Limited Search的东西。同一页面中提供了易于理解的伪代码。

    上述库的其他功能可以用谷歌搜索,很容易理解。祝你好运。

    【讨论】:

      【解决方案2】:

      您可能想为此尝试Mechanize - 它比 urllib 和其他内置库更高级别。特别是,它可以像使用浏览器一样轻松导航,使用 follow_link() 和 back() 等命令。

      要获得所需的行,请查看一些 Wikipedia 页面的来源,以了解摘要在 HTML 页面中的开始位置 - 从快速浏览中,我认为您想找到 id 为“mw-”的 div content-text" 并从第一个 <p> 元素中获取文本。正如其他人所提到的,Beautiful Soup 会很擅长这个。

      或者,您可以尝试使用 Wikipedia 的 Python 库之一 - 这里有一个列表:http://en.wikipedia.org/wiki/Wikipedia%3aCreating_a_bot#Python 和 some recommendations in other stackoverflow 答案。

      听起来是个有趣的小项目,祝你好运!

      【讨论】:

        【解决方案3】:

        使用BeautifulSoup 或Scrapy 解析html 页面。使用urllib 或requests 获取嵌套页面。您可能需要使用一些正则表达式来按摩或评估提取的链接。

        【讨论】:

          【解决方案4】:

          您可以解析 html 或解析原始版本以查找 [[Link]]。 无论哪种方式,您都应该看看:

          urllib 或 requests

          【讨论】:

            【解决方案5】:

            使用 wikipedia python 库,它可以让您查看页面上的链接,包括“另请参阅”部分中的链接,您可以遍历它们并使用该库来获取其中的内容。 https://pypi.python.org/pypi/wikipedia

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-07-20
              • 1970-01-01
              • 2010-10-12
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多