# https://www.wikidata.org/wiki/Wikidata:Pywikibot_-_Python_3_Tutorial/Data_Harvest
# Pour exécuter une entrée : Shift + Enter
import pywikibot

site = pywikibot.Site("en", "wikipedia")
page = pywikibot.Page(site, "Douglas Adams")  # Page de Wikipedia en anglais sur Douglas Adams
item = pywikibot.ItemPage.fromPage(page)  # Item Wikidata correspondant à cette page

print(item)  # item est un objet de type ItemPage
[[wikidata:Q42]]
print(dir(item)) # méthodes de l'objet de type ItemPage
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__unicode__', '__weakref__', '_cache_attrs', '_cmpkey', '_content', '_cosmetic_changes_hook', '_defined_by', '_diff_to', '_getInternals', '_get_parsed_page', '_isredir', '_latest_cached_revision', '_link', '_namespace', '_namespace_obj', '_normalizeData', '_normalizeLanguages', '_revid', '_revisions', '_save', 'addClaim', 'aliases', 'applicable_protections', 'aslink', 'autoFormat', 'backlinks', 'botMayEdit', 'canBeEdited', 'categories', 'change_category', 'claims', 'clear_cache', 'concept_url', 'content_model', 'contributingUsers', 'contributors', 'coordinates', 'data_item', 'data_repository', 'defaultsort', 'delete', 'depth', 'descriptions', 'editAliases', 'editDescriptions', 'editEntity', 'editLabels', 'editTime', 'embeddedin', 'encoding', 'entity_type', 'exists', 'expand_text', 'extlinks', 'fromPage', 'fullVersionHistory', 'full_url', 'get', 'getCategoryRedirectTarget', 'getCreator', 'getDeletedRevision', 'getID', 'getLatestEditors', 'getMovedTarget', 'getOldVersion', 'getRedirectTarget', 'getReferences', 'getRestrictions', 'getSitelink', 'getTemplates', 'getVersionHistory', 'getVersionHistoryTable', 'getdbName', 'id', 'image_repository', 'imagelinks', 'interwiki', 'isAutoTitle', 'isCategory', 'isCategoryRedirect', 'isDisambig', 'isEmpty', 'isFlowPage', 'isImage', 'isIpEdit', 'isRedirectPage', 'isStaticRedirect', 'isTalkPage', 'is_flow_page', 'is_valid_id', 'iterlanglinks', 'iterlinks', 'itertemplates', 'labels', 'langlinks', 'lastNonBotUser', 'latestRevision', 'latest_revision', 'latest_revision_id', 'linkedPages', 'loadDeletedRevisions', 'markDeletedRevision', 'mergeInto', 'merge_history', 'move', 'moved_target', 'namespace', 'oldest_revision', 'pageAPInfo', 'pageid', 'permalink', 'preloadText', 'previousRevision', 'previous_revision_id', 'properties', 'protect', 'protection', 'purge', 'put', 'put_async', 'removeClaims', 'removeImage', 'removeSitelink', 'removeSitelinks', 'replaceImage', 'repo', 'revision_count', 'revisions', 'save', 'section', 'sectionFreeTitle', 'setSitelink', 'setSitelinks', 'set_redirect_target', 'site', 'sitelinks', 'templates', 'text', 'title', 'titleForFilename', 'titleWithoutNamespace', 'title_pattern', 'toJSON', 'toggleTalkPage', 'touch', 'undelete', 'urlname', 'userName', 'version', 'watch']
item_dict = item.get()  # retourne l'item sous la forme d'un dictionnaire
print(item_dict.keys())
dict_keys(['labels', 'claims', 'descriptions', 'sitelinks', 'aliases'])
print(item_dict["labels"])
{'sl': 'Douglas Adams', 'eo': 'Douglas Adams', 'vo': 'Douglas Adams', 'si': 'ඩග්ලස් ඇඩම්ස්', 'gl': 'Douglas Adams', 'vec': 'Douglas Adams', 'min': 'Douglas Adams', 'fr': 'Douglas Adams', 'da': 'Douglas Adams', 'cs': 'Douglas Adams', 'el': 'Ντάγκλας Άνταμς', 'ko': '더글러스 애덤스', 'zh-my': '道格拉斯·亚当斯', 'ca': 'Douglas Adams', 'hr': 'Douglas Adams', 'th': 'ดั๊กลาส อดัมส์', 'sr': 'Даглас Адамс', 'rm': 'Douglas Adams', 'bs': 'Douglas Adams', 'la': 'Duglassius Adams', 'ar': 'دوغلاس آدمز', 'ta': 'டக்ளஸ் ஆடம்ஸ்', 'oc': 'Douglas Adams', 'fi': 'Douglas Adams', 'ml': 'ഡഗ്ലസ് ആഡംസ്', 'nds': 'Douglas Adams', 'en': 'Douglas Adams', 'an': 'Douglas Adams', 'hu': 'Douglas Adams', 'war': 'Douglas Adams', 'wa': 'Douglas Adams', 'pcd': 'Douglas Adams', 'fur': 'Douglas Adams', 'te': 'డగ్లస్ ఆడమ్స్', 'mg': 'Douglas Adams', 'es': 'Douglas Adams', 'nl': 'Douglas Adams', 'he': 'דאגלס אדמס', 'de': 'Douglas Adams', 'ast': 'Douglas Adams', 'lv': 'Duglass Adamss', 'fa': 'داگلاس آدامز', 'fo': 'Douglas Adams', 'ne': 'डगलस एडम्स', 'zh': '道格拉斯·亚当斯', 'af': 'Douglas Adams', 'ru': 'Дуглас Адамс', 'pt': 'Douglas Adams', 'ak': 'Doglas Adams', 'az': 'Duqlas Noel Adams', 'nap': 'Douglas Adams', 'sq': 'Douglas Adams', 'ia': 'Douglas Adams', 'tcy': 'ಡಾಗ್ಲಸ್ ಆಡಮ್ಸ್', 'arz': 'دوجلاس ادامز', 'uk': 'Дуглас Адамс', 'be-tarask': 'Дуглас Адамз', 'bar': 'Douglas Adams', 'nn': 'Douglas Adams', 'ja': 'ダグラス・アダムズ', 'pl': 'Douglas Adams', 'pms': 'Douglas Adams', 'co': 'Douglas Adams', 'tr': 'Douglas Adams', 'is': 'Douglas Adams', 'gu': 'ડગ્લાસ એડમ્સ', 'hi': 'डग्लस अ\u200dडम्स', 'nb': 'Douglas Adams', 'ga': 'Douglas Adams', 'wo': 'Douglas Adams', 'sh': 'Douglas Adams', 'or': 'ଡଗ୍\u200cଲାସ୍\u200c ଆଦାମ୍\u200cସ', 'frp': 'Douglas Adams', 'zh-hant': '道格拉斯·亞當斯', 'zh-cn': '道格拉斯·亚当斯', 'lmo': 'Douglas Adams', 'pt-br': 'Douglas Adams', 'ro': 'Douglas Adams', 'rwr': 'डग्लस अ\u200dडम्स', 'gsw': 'Douglas Adams', 'ka': 'დაგლას ადამსი', 'jv': 'Douglas Adams', 'sv': 'Douglas Adams', 'eu': 'Douglas Adams', 'pa': 'ਡਗਲਸ ਐਡਮਜ਼', 'gd': 'Douglas Adams', 'it': 'Douglas Adams', 'zu': 'Douglas Adams', 'zh-mo': '道格拉斯·亞當斯', 'bg': 'Дъглас Адамс', 'ur': 'ڈگلس ایڈم', 'ms': 'Douglas Adams', 'nrm': 'Douglas Adams', 'zh-sg': '道格拉斯·亚当斯', 'en-ca': 'Douglas Adams', 'zh-hk': '道格拉斯·亞當斯', 'br': 'Douglas Adams', 'lt': 'Douglas Adams', 'de-ch': 'Douglas Adams', 'ie': 'Douglas Adams', 'zh-tw': '道格拉斯·亞當斯', 'sw': 'Douglas Adams', 'kl': 'Douglas Adams', 'ckb': 'دەگلاس ئادمز', 'kn': 'ಡಾಗ್ಲಸ್ ಆಡಮ್ಸ್', 'cy': 'Douglas Adams', 'sc': 'Douglas Adams', 'vi': 'Douglas Adams', 'de-at': 'Douglas Adams', 'lb': 'Douglas Adams', 'hy': 'Դուգլաս Ադամս', 'zh-hans': '道格拉斯·亚当斯', 'mr': 'डग्लस अॅडम्स', 'et': 'Douglas Adams', 'tl': 'Douglas Adams', 'sr-ec': 'Даглас Адамс', 'vls': 'Douglas Adams', 'mrj': 'Адамс', 'vep': 'Adams Duglas', 'be': 'Дуглас Адамс', 'bn': 'ডগলাস অ্যাডামস', 'kg': 'Douglas Adams', 'id': 'Douglas Adams', 'sco': 'Douglas Adams', 'nds-nl': 'Douglas Adams', 'io': 'Douglas Adams', 'mk': 'Даглас Адамс', 'lij': 'Douglas Adams', 'sk': 'Douglas Adams', 'sr-el': 'Daglas Adams', 'en-gb': 'Douglas Adams', 'li': 'Douglas Adams', 'scn': 'Douglas Adams'}
# Il est également possible d'accéder directement à l'item Wikidata sans passer par la page Wikipedia
site = pywikibot.Site("wikidata", "wikidata")
print(site)
repo = site.data_repository()
print(repo)
item = pywikibot.ItemPage(repo, "Q42")
wikidata:wikidata
wikidata:wikidata
# On veut récupérer le moment magnétique (P2069) de l'electron (Q2225)
# https://www.wikidata.org/wiki/Q2225

site = pywikibot.Site("wikidata", "wikidata")
repo = site.data_repository()
item = pywikibot.ItemPage(repo, "Q2225")

item_dict = item.get()
clm_dict = item_dict["claims"] # dictionnaire des statements liés à l'item Q2225
clm_list = clm_dict["P2069"] # renvoie une liste des statements utilisant la propriété P2069

for clm in clm_list:  # chaque statement (clm) est un objet de type Claim
    print(clm.toJSON()) # On peut obtenir les informations souhaitées sous forme de JSON
    print("-----")
    print(dir(clm))
    clm_trgt = clm.getTarget() # retourne un objet de type WbQuantity 
    print("-----")
    print(dir(clm_trgt))
    print("-----")
    print(clm_trgt.amount)
    # print(clm_trgt.unit)        
{'rank': 'normal', 'id': 'Q2225$edaaaf4e-48fd-6503-016c-27d857e55f40', 'type': 'statement', 'mainsnak': {'datatype': 'quantity', 'datavalue': {'type': 'quantity', 'value': {'unit': 'http://www.wikidata.org/entity/Q737120', 'upperBound': '-1.00115965218075', 'lowerBound': '-1.00115965218077', 'amount': '-1.00115965218076'}}, 'property': 'P2069', 'snaktype': 'value'}}
-----
['SNAK_TYPES', 'TARGET_CONVERTER', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_formatDataValue', '_formatValue', '_type', 'addQualifier', 'addSource', 'addSources', 'changeRank', 'changeSnakType', 'changeTarget', 'fromJSON', 'getID', 'getRank', 'getSnakType', 'getSources', 'getTarget', 'getType', 'has_qualifier', 'hash', 'id', 'isQualifier', 'isReference', 'on_item', 'qualifierFromJSON', 'qualifiers', 'rank', 'referenceFromJSON', 'removeQualifier', 'removeQualifiers', 'removeSource', 'removeSources', 'repo', 'setRank', 'setSnakType', 'setTarget', 'snak', 'snaktype', 'sources', 'target', 'target_equals', 'toJSON', 'type', 'types', 'value_types']
-----
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_fromdecimal', '_items', '_require_errors', '_todecimal', 'amount', 'fromWikibase', 'lowerBound', 'toWikibase', 'unit', 'upperBound']
-----
-1.00115965218076
# Essai personnel : récupérer les coordonnées spatiales de Quimperlé (Q235382)
quimperle_item = pywikibot.ItemPage(repo, 'Q235382')
quimperle_item_dict = quimperle_item.get()
quimperle_item_dict_claims = quimperle_item_dict['claims']
print(quimperle_item_dict_claims)
{'P281': [<pywikibot.page.Claim object at 0x7f92a5c04e48>], 'P625': [<pywikibot.page.Claim object at 0x7f92a5a23a20>], 'P268': [<pywikibot.page.Claim object at 0x7f92a5a23b00>], 'P1082': [<pywikibot.page.Claim object at 0x7f92a5a23b70>], 'P421': [<pywikibot.page.Claim object at 0x7f92a5a2ae48>], 'P17': [<pywikibot.page.Claim object at 0x7f92a5a25208>], 'P190': [<pywikibot.page.Claim object at 0x7f92a5a254a8>], 'P47': [<pywikibot.page.Claim object at 0x7f92a5a256d8>, <pywikibot.page.Claim object at 0x7f92a5a258d0>, <pywikibot.page.Claim object at 0x7f92a5a25a20>, <pywikibot.page.Claim object at 0x7f92a5a25b70>, <pywikibot.page.Claim object at 0x7f92a5a25cc0>, <pywikibot.page.Claim object at 0x7f92a5a25e10>, <pywikibot.page.Claim object at 0x7f92a5a25f60>], 'P1740': [<pywikibot.page.Claim object at 0x7f92a5a2a0f0>], 'P94': [<pywikibot.page.Claim object at 0x7f92a5a2a2b0>], 'P373': [<pywikibot.page.Claim object at 0x7f92a5a2a390>], 'P214': [<pywikibot.page.Claim object at 0x7f92a5a2a3c8>], 'P910': [<pywikibot.page.Claim object at 0x7f92a5a2a518>], 'P1465': [<pywikibot.page.Claim object at 0x7f92a5a2a748>], 'P31': [<pywikibot.page.Claim object at 0x7f92a5a2a898>], 'P242': [<pywikibot.page.Claim object at 0x7f92a5a2a9e8>], 'P1566': [<pywikibot.page.Claim object at 0x7f92a5a2ac50>], 'P1456': [<pywikibot.page.Claim object at 0x7f92a5a2ac88>], 'P646': [<pywikibot.page.Claim object at 0x7f92a5a23fd0>], 'P982': [<pywikibot.page.Claim object at 0x7f92a5a2f438>], 'P131': [<pywikibot.page.Claim object at 0x7f92a5a2f550>, <pywikibot.page.Claim object at 0x7f92a5a2f7f0>, <pywikibot.page.Claim object at 0x7f92a5a2fac8>], 'P1464': [<pywikibot.page.Claim object at 0x7f92a5a2fcf8>], 'P374': [<pywikibot.page.Claim object at 0x7f92a5a2fe10>], 'P2046': [<pywikibot.page.Claim object at 0x7f92a5a2f048>], 'P1376': [<pywikibot.page.Claim object at 0x7f92a5a34048>], 'P856': [<pywikibot.page.Claim object at 0x7f92a5a34438>], 'P244': [<pywikibot.page.Claim object at 0x7f92a5a345f8>], 'P18': [<pywikibot.page.Claim object at 0x7f92a5a34748>], 'P227': [<pywikibot.page.Claim object at 0x7f92a5a2fe48>]}
# On peut voir sur la page wikidata de Quimperlé (https://www.wikidata.org/wiki/Q235382) que la déclaration 
# concernant les coordonnées géographiques utilise la propriété P625.
quimperle_item_dict_claims_P625_claim_list = quimperle_item_dict_claims['P625']
for clm in quimperle_item_dict_claims_P625_claim_list:  # chaque statement (clm) est un objet de type Claim
    print(clm.toJSON()) # On peut obtenir les informations souhaitées sous forme de JSON
    print("-----")
    print(dir(clm))
    clm_trgt = clm.getTarget() # retourne un objet de type WbQuantity 
    print("-----")
    print(dir(clm_trgt))
    print("-----")
    print(clm_trgt.lat)
    print(clm_trgt.lon)
{'rank': 'normal', 'id': 'q235382$07AA4105-E3FE-463C-81F4-E1A07895B47C', 'references': [{'snaks': {'P813': [{'datatype': 'time', 'datavalue': {'type': 'time', 'value': {'after': 0, 'time': '+00000002015-10-26T00:00:00Z', 'timezone': 0, 'calendarmodel': 'http://www.wikidata.org/entity/Q1985727', 'precision': 11, 'before': 0}}, 'property': 'P813', 'snaktype': 'value'}], 'P248': [{'datatype': 'wikibase-item', 'datavalue': {'type': 'wikibase-entityid', 'value': {'numeric-id': 20894925, 'entity-type': 'item'}}, 'property': 'P248', 'snaktype': 'value'}]}, 'snaks-order': ['P248', 'P813'], 'hash': '6d431cd7ffdbfb694d17f7486e36d45897fc6275'}], 'type': 'statement', 'mainsnak': {'datatype': 'globe-coordinate', 'datavalue': {'type': 'globecoordinate', 'value': {'precision': 0.00027777777777778, 'longitude': -3.5497222222222, 'altitude': None, 'globe': 'http://www.wikidata.org/entity/Q2', 'latitude': 47.872777777778}}, 'property': 'P625', 'snaktype': 'value'}}
-----
['SNAK_TYPES', 'TARGET_CONVERTER', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_formatDataValue', '_formatValue', '_type', 'addQualifier', 'addSource', 'addSources', 'changeRank', 'changeSnakType', 'changeTarget', 'fromJSON', 'getID', 'getRank', 'getSnakType', 'getSources', 'getTarget', 'getType', 'has_qualifier', 'hash', 'id', 'isQualifier', 'isReference', 'on_item', 'qualifierFromJSON', 'qualifiers', 'rank', 'referenceFromJSON', 'removeQualifier', 'removeQualifiers', 'removeSource', 'removeSources', 'repo', 'setRank', 'setSnakType', 'setTarget', 'snak', 'snaktype', 'sources', 'target', 'target_equals', 'toJSON', 'type', 'types', 'value_types']
-----
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_dim', '_entity', '_items', '_precision', 'alt', 'entity', 'fromWikibase', 'globe', 'lat', 'lon', 'name', 'precision', 'precisionToDim', 'site', 'toWikibase', 'type']
-----
47.872777777778
-3.5497222222222