Manual:Pywikibot/Compat/Wikidata

Creating a DataPage object edit

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 edit

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 edit

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

Changing descriptions edit

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

Changing sitelinks edit

data.setitem(summary=u"BOT SUMMARY",
         items={'type': u'sitelink', 'site': 'de', 'title': 'OK'})

Changing or creating claims/statements edit

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) edit

dictionary = data.get()

Removing claim or claims edit

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 edit

data.createitem('summary')

Example edit

Simple example for creating new items.

  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")