Jump to content

Manual:Pywikibot/Compat/Wikidata

From mediawiki.org

Creating a DataPage object

Different ways to create a DataPage and Page object for Wikidata: First way is creating a data_repo first, use this way only when you have ID of the item (Q####)

import pywikibot
# create a site object, here for en-wiki
site = pywikibot.getSite('en')

# get the data repository site for the given site
repo = site.data_repository()

# OR you may also get the site by language code/family:
# repo = pywikibot.getSite('wikidata', 'wikidata')

# We also can create a DataPage by its ID in two ways
# First by site and title:
data = pywikibot.DataPage(repo, "Q42")
#OR the second way by the ID number:
data = pywikibot.DataPage(42)

the second way is:

import pywikibot
# create a site object, here for en-wiki
site = pywikibot.getSite('en')

# create a Page object for en-wiki
page = pywikibot.Page(site, "Helium")

# Now we create the corresponding DataPage:
data = pywikibot.DataPage(page)
# Warning: This page does not have a valid title until you get its content
You cannot change any item, value, or label without getting data first.

Getting data

Get the data in a simple way

# get an entity of that page
dictionary = data.get()

# get interwiki links as page objects
language_links = data.interwiki()

Changing labels

data.setitem(summary=u"BOT SUMMARY",
         items={'type': u'item', 'label': 'fa', 'value': 'هلیم'})

Changing descriptions

page.setitem(summary=u"BOT SUMMARY",
         items={'type': u'description', 'language': 'en', 'value': 'noble gas'})
data.setitem(summary=u"BOT SUMMARY",
         items={'type': u'sitelink', 'site': 'de', 'title': 'OK'})

Changing or creating claims/statements

data.editclaim(property, value ,refs={("ref1","value1"),("ref2","value2")})
property can be a string like "capital" or "p36" or "P36" or "36" or 36
value can be a string like "Moscow" or "Q649" or "q649" or "649" or 649
refs is optional and if you don't add any references the bot will change either:
ref1 can be a string like "imported from" or "p143" or etc
value1 can be a string like "English Wikipedia" or "q328" or etc
other refs are optional too
Remember
Important:language of values must the same as the Wikipedia page you load at first. For example, if you load Russia from Deutsch Wikipedia your values must be:
data.editclaim("Hauptstadt", "Moskau" ,refs={("Datenvorlage","Englischsprachige Wikipedia ")})

and if you run your bot on English values, the bot won't work

If there was a claim already the code changes the claim, and if not the code adds the claim.

Getting all entities (of an item)

dictionary = data.get()

Removing claim or claims

data.removeclaim(property, value)

you can add the property in the way shown above, value is optional and it's better to use when we have multiple claims for a statement if you don't use value, every claim that uses the property will be removed

Creating an item

data.createitem('summary')

Example

Simple example for creating new items.

Caution! Caution: Use this code snippet with care. It does not test whether a data repository item already exists. It only test whether it exists for a given site page. This could also mean that a given site page has no language link on a given repository page. This should be checked before a page is created.
# -*- coding: utf-8  -*-
import wikipedia
site = wikipedia.getSite('fa') # add parameter fam='wikipedia' if you haven't declared family = 'wikipedia' in your user-config.py

list_of_articles=[u"دهستان جونقان", u"قنات_بزل_وار", u"قنات_بسک", u"قنات_بشرآباد"]
for name in list_of_articles:
    # create a Page object of a site
    page = wikipedia.Page(site, name)
    # create the corresponding data repository object
    data = wikipedia.DataPage(page)
    if data.exists():
        wikipedia.output(u"%s already exists. Skipping..." % name)
    else:
        wikipedia.output(u"%s is missing. Creating..." % name)
        data.createitem(u"Bot: Importing article from Persian wikipedia")