如何使用Python刮取类别维基百科页面类别中的子类别和页面

时间:2017-02-27 20:43:14

标签: python json web-scraping wikipedia

所以我试图抓住类别页面的类别标题下的所有子类别和页面:"类别:基于类的编程语言"发现于:

https://en.wikipedia.org/wiki/Category:Class-based_programming_languages

我已经找到了使用网址和mediawiki API:Categorymembers的方法。这样做的方法是:

  • base:en.wikipedia.org/w/api.php?action=query&list=categorymembers&cmtitle=Category:Class-based%20programming%20languages&format=json&cmlimit=500
  • base:en.wikipedia.org/w/api.php?action=query&list=categorymembers&cmtitle=Category:Class-based%20programming%20languages&format=json&cmlimit=500&cmtype=subcat

但是,我找不到使用Python实现此目的的方法。任何人都可以帮助我吗?

这是为了独立学习,我花了很多时间在这上面,但似乎无法弄明白。此外,禁止使用Beautifulsoup。谢谢你的帮助!

2 个答案:

答案 0 :(得分:3)

好的,经过更多的研究和研究,我能够找到自己问题的答案。使用库urllib.request和json,我以json格式导入了wikipedia url文件,并简单地以这种方式打印了它的类别。这是我用来获取子类别的代码:

pages = urllib.request.urlopen("https://en.wikipedia.org/w/api.phpaction=query&list=categorymembers&cmtitle=Category:Class-based%20programming%20languages&format=json&cmlimit=500&cmtype=subcat")
data = json.load(pages)
query = data['query']
category = query['categorymembers']
for x in category:
    print (x['title'])

你可以为类别中的页面做同样的事情。感谢Nemo试图帮助我!

答案 1 :(得分:1)

import requests
from lxml import html
wiki_page = requests.get('https://en.wikipedia.org/wiki/Category:Class based_programming_languages')
tree = html.fromstring(wiki_page.content)

要建立你如何使用它的直觉,右键点击,比如'C ++',然后点击'inspect',你会看到右边的面板会突出显示

<a class="CategoryTreeLabel  CategoryTreeLabelNs14   
CategoryTreeLabelCategory" href="/wiki/Category:C%2B%2B">C++</a>

右键单击此按钮,然后单击“复制xpath”。对于C ++,这将为您提供

//*[@id="mw-subcategories"]/div/ul[1]/li/div/div[1]/a

同样,在页面下,对于'ActionScript',我们得到

//*[@id="mw-pages"]/div/div/div[1]/ul/li[1]/a

因此,如果您要查找所有子类别/页面名称,您可以这样做,例如

pages = tree.xpath('//*[@id="mw-pages"]/text()')
subcategories = tree.xpath('//*[@id="mw-subcategories"]/text()')

For more information see herehere