Wikidata:Pywikibot - Python 3 Tutorial/Structured Data on Commons
Sample code to work with Structured Data on Commons
import pywikibot
commons_site = pywikibot.Site("commons", "commons")
# File to test and work with
commonsfilename='File:Madame X (Madame Pierre Gautreau) MET DT278076.jpg'
page = pywikibot.FilePage(commons_site, commonsfilename)
# Retrieve Wikibase data
item = page.data_item()
item.get()
print ('Commons MID:', item.id) # M56723871
for prop in item.claims:
for statement in item.claims[prop]:
if isinstance(statement.target, pywikibot.page._wikibase.ItemPage):
print (prop, statement.target.id, statement.target.labels.get('en'))
else:
print (prop, statement.target)
Sample output:
Commons MID: M56723871
P180 Q2664039 Portrait of Madame X
P180 Q116887 décolletage
P180 Q467 woman
P6243 Q2664039 Portrait of Madame X
P921 Q2664039 Portrait of Madame X
P1163 image/jpeg
P31 Q3305213 painting
P136 Q1400853 portrait painting
Adding qualifiers edit
import pywikibot
# Add qualifier to existing claim
# https://www.wikidata.org/wiki/Wikidata:Pywikibot_-_Python_3_Tutorial/Setting_qualifiers
def add_qualifier(claim, qualifier_prop, qualifier_value):
wikidata_site = pywikibot.Site("wikidata", "wikidata")
print(f'Adding qualifier: {qualifier_prop} {qualifier_value} to claim value {claim.getTarget()}')
# Create qualifier
qualifier = pywikibot.Claim(wikidata_site, qualifier_prop)
qualifier_target = pywikibot.ItemPage(wikidata_site, qualifier_value)
qualifier.setTarget(qualifier_target)
# Add qualifier to claim. This already saves the edit.
claim.addQualifier(qualifier)
# Return False if qualifier with qualifier_value doesn't exits
def test_if_qualifier_exists(claim, qualifier_prop, qualifier_value):
if not claim.qualifiers:
return False
elif not qualifier_prop in claim.qualifiers:
return False
else:
for qualifier in claim.qualifiers[qualifier_prop]:
qualifier_value = qualifier.getTarget()
if qualifier_value == qualifier.getTarget():
return True
### MAIN()
# Connect to Wikidata
site = pywikibot.Site("commons", "commons")
repo = site.data_repository()
# Load the commons item
page = pywikibot.FilePage(site, 'File:Akateemisen Karjala-Seuran 15-vuotisjuhlat Vanhalla ylioppilastalolla 21.2.1937.jpg') # Specify the file
item = page.data_item() # Get the data item associated with the page
# Identify the claim (assuming you know the property ID)
property_id = "P9310" # Replace with the actual property ID of the claim
claims = item.claims[property_id]
qualifier_prop = "P459"
qualifier_value = "Q104884110"
# Loop through claims
for claim in claims:
print(f"Property: {property_id}, Value: {claim.getTarget()}")
qualifier_exists = test_if_qualifier_exists(claim, qualifier_prop, qualifier_value)
if qualifier_exists:
print(f'Qualifier: {qualifier_prop} : {qualifier_value} already exists.')
else:
add_qualifier(claim, qualifier_prop, qualifier_value)