【问题标题】:How do I get the HTML of a wiki page with Pywikibot?如何使用 Pywikibot 获取 wiki 页面的 HTML?
【发布时间】:2015-02-11 02:42:45
【问题描述】:

我正在使用 pywikibot-core,并且在另一个 python Mediawiki API 包装器之前使用了 Wikipedia.py(它有一个 .HTML 方法)。我切换到 pywikibot-core 因为我认为它有更多功能,但我找不到类似的方法。 (注意:我不是很熟练)。

【问题讨论】:

    标签: python wikipedia wikipedia-api pywikibot


    【解决方案1】:

    "[saveHTML.py] 下载文章和图片的 HTML 页面并保存有趣的部分,即文章文本和页脚到文件"

    来源:https://git.wikimedia.org/blob/pywikibot%2Fcompat.git/HEAD/saveHTML.py

    【讨论】:

    • 感谢代言人。但这是一个脚本吧?它只是在 pywikibot-compat 中还是在核心中?我总是很困惑:-S
    【解决方案2】:

    IIRC 你想要整个页面的 HTML,所以你需要使用 api.php?action=parse 的东西。在 Python 中,我经常只使用 wikitools 来完成这样的事情,我不知道 PWB 或您的其他要求。

    【讨论】:

    • 感谢 user283120,我也得出了这个结论。我想要(如果存在的话!)一种直接的 PWB 方法:我决定使用它,因为我认为它是处理基于 Mediawiki 网站的最完整的软件......
    • PWB 专注于编辑和类似操作。我经常使用比 PWB 容易提供的更低级别的 API 模块,但这可能只是我自己。
    【解决方案3】:

    一般而言,您应该使用 pywikibot 而不是 wikipedia(例如,而不是“import wikipedia”,而应该使用“import pywikibot”),如果您正在寻找 wikipedia.py 中的方法和类,它们现在是分开的并且可以在pywikibot文件夹中找到(主要在page.py和site.py中)

    如果您想运行您在 compat 中编写的脚本,您可以使用 pywikibot-core 中名为 compat2core.py 的脚本(在脚本文件夹中),并且有一个名为 README-conversion.txt 的关于转换的详细帮助,请阅读仔细看看。

    【讨论】:

      【解决方案4】:

      我将在此处发布 user283120 第二个答案,比第一个更精确:

      Pywikibot 核心不支持与 Wiki 交互的任何直接 (HTML) 方式,因此您应该使用 API。 如果需要,可以使用 urllib2 轻松完成。

      这是我用来在 commons 中获取 wiki 页面的 HTML 的示例: import urllib2 ... url = "@987654321@" + page.title().replace(" ","_") html = urllib2.urlopen(url).read().decode('utf-8')

      【讨论】:

      • 我将我的答案设置为社区 wiki,您可以编辑它。 :)
      • 抱歉,我是这里的新手,而且声望为 1,我认为我无法编辑任何内容。如果您想将此答案粘贴到您的答案中,我很好:-)。
      【解决方案5】:

      Mediawiki API 有一个解析操作,允许获取由 Mediawiki 标记解析器返回的 wiki 标记的 html sn-p。

      对于pywikibot library,已经实现了一个函数,您可以像这样使用它:

      def getHtml(self,pageTitle):
              '''
              get the HTML code for the given page Title
              
              Args:
                  pageTitle(str): the title of the page to retrieve
                  
              Returns:
                  str: the rendered HTML code for the page
              '''
              page=self.getPage(pageTitle)
              html=page._get_parsed_page()
              return html
      

      当使用mwclient python library 时,有一个通用的 api 方法,请参阅: https://github.com/mwclient/mwclient/blob/master/mwclient/client.py

      这可以用来检索像这样的html代码:

      def getHtml(self,pageTitle):
              '''
              get the HTML code for the given page Title
              
              Args:
                  pageTitle(str): the title of the page to retrieve
              '''
              api=self.getSite().api("parse",page=pageTitle)
              if not "parse" in api:
                  raise Exception("could not retrieve html for page %s" % pageTitle)
              html=api["parse"]["text"]["*"]
              return html   
      

      如上所示,这给出了一个duck typed interface,它在我是提交者的py-3rdparty-mediawiki 库中实现。关闭 issue 38 - add html page retrieval

      解决了这个问题

      【讨论】:

      • 您能举一个getHtmlpywikibot 的工作示例吗? grep 在代码库中找不到任何getHtml 的实例。
      • 它是 pywikibot 中的 getPage 和 mwclient 中的 .api("parse")。上面的代码不在库中,但显示了如何使用它。
      【解决方案6】:

      使用 Pywikibot,您可以使用 http.request() 获取 html 内容:

      import pywikibot
      from pywikibot.comms import http
      site = pywikibot.Site('wikipedia:en')
      page = pywikibot.Page(s, 'Elvis Presley')
      path = '{}/index.php?title={}'.format(site.scriptpath(), page.title(as_url=True))
      r = http.request(site, path)
      print(r[94:135])
      

      这应该给出html内容

      '<title>Elvis Presley – Wikipedia</title>\n'
      

      使用 Pywikibot 6.0 http.request() 提供 requests.Response 对象而不是纯文本。在这种情况下,您必须使用 text 属性:

      print(r.text[94:135])
      

      得到相同的结果。

      【讨论】:

        猜你喜欢
        • 2020-07-08
        • 2015-07-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-02
        • 2013-05-18
        相关资源
        最近更新 更多