在mwparserfromhell中获取下一个节点

时间:2017-06-10 04:43:05

标签: python mediawiki-api

我正在使用mwparserfromhell解析WikiMedia文本。

我需要从页面获取地点。

例如,当我使用API查询Muriel时  (Wiki Link),我可以在filter_headings()解析后得到所有标题。现在我需要在标题下获取内容。

我可以获得标题("地方"),但如何获取其内容?

这是代码。任何帮助将不胜感激。

import mwparserfromhell
import urllib.request
import urllib.parse
import json


def main():
    search('muriel')


def search(name):
    wiki_parsed = get_json(name, True)
    headings = wiki_parsed.filter_headings()
    filtered_headings = [heading
                         for heading in headings
                         if heading.title == 'Places']

    if len(filtered_headings) > 0:
        print(filtered_headings[0])

        # ===================================
        # need to get the content inside heading
        #
        # ?????????????????????????????????????


def get_json(name, ignore_cache=False):
    url = 'https://en.wikipedia.org/w/api.php'

    args = {'action': 'query',
            'titles': name,
            'prop': 'revisions',
            'rvprop': 'content',
            'format': 'json'}

    content = get_url_content(url, args)

    data = json.loads(content)
    wiki_text = (list(data['query']['pages'].values())[
                 0]['revisions'][0]['*'])
    parsed = mwparserfromhell.parse(wiki_text)

    return parsed


def get_url_content(url, req_params):
    url = url + '?' + urllib.parse.urlencode(req_params)
    fp = urllib.request.urlopen(url)
    str_content = fp.read().decode('utf-8', 'ignore')
    fp.close()
    return str_content

if __name__ == "__main__":
    main()

1 个答案:

答案 0 :(得分:0)

在MediaWiki语法中,内容并非真正"内部"部分,部分标题更像是锚点,页面上的标记。这意味着你可以做像

这样的事情
== section 1 ==
{|
|
== section 2 ==
|}

将导致

<h2>section 1</h2>
<table>
  <tr>
    <td>
      <h2>section 2</h2>
    </td>
  </tr>
</table>

在这种情况下,第1部分的内容是什么?