如何使用 Python 在类别***页面的类别中抓取子类别和页面

Posted

技术标签:

【中文标题】如何使用 Python 在类别***页面的类别中抓取子类别和页面【英文标题】:How to scrape Subcategories and pages in categories of a Category wikipedia page using Python 【发布时间】:2017-07-18 15:16:13 【问题描述】:

所以我试图抓取类别页面的类别标题下的所有子类别和页面:“类别:基于类的编程语言”位于:

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

我想出了一种方法来使用 url 和 mediawiki API:Categorymembers。这样做的方法是:

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

但是,我找不到使用 Python 完成此任务的方法。有谁能帮帮我吗?

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

【问题讨论】:

可以使用lxml吗? 是的。没有问题! 【参考方案1】:

好的,经过更多的研究和研究,我能够找到自己问题的答案。使用库 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 帮助我!

【讨论】:

@Park。谢谢。但是如何提取所有可用页面的内容(比如将某个类别的页面限制为 1000 个)?【参考方案2】:
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++”,然后单击“检查”,您会看到右侧的面板已突出显示

<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”,我们得到 ​​p>

//*[@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 here 和 here

【讨论】:

您能详细说明一下吗?我没有更清楚的方式。我正在研究刮掉该类别的所有子类别/页面名称,可以说类别:计算机科学。链接是https://en.wikipedia.org/wiki/Category:Computer_science 没有这样的限制。 BeautifulSoup 可以用!

以上是关于如何使用 Python 在类别***页面的类别中抓取子类别和页面的主要内容,如果未能解决你的问题,请参考以下文章

WordPress:如何将类别页面标题更改为仅类别名称?

如何使用 WooCommerce 更改每行的产品类别数

我想使用 hasManyThrough 关系在类别页面上显示分页

如何在子类别页面中显示 Wordpress 类别?

woocommerce-如何仅在商店页面上显示子类别?

如何在 Wordpress 的存档页面上显示所有类别的帖子?