J'ai un artiste cible et j'aimerais récupérer son identifiant de correspondant, comme: mais mon Quelle est la meilleure façon de réaliser cela à l'aide d'un Je veux aller au-dessus de "vg1jyl3cr60" p> éditer strong>: @Alexandre Cécile. Je poste ici la fonction entière qui appelle YouTube API, si vous souhaitez perfectionner la fonction qui réduit la recherche de vidéos d'artiste, une fois que vous passez le titre de titre et le nom de l'artiste. Vous aurez besoin d'une clé pour cela, cependant. P> si code> condition ne fonctionne pas pour l'artiste cible. Je n'imprime aucun résultat. P>
pour code> boucle ou autrement, en considérant que la liste réelle est très grande? P>
from google.oauth2 import service_account
def youtube_id(track_name, target_artist):
GET_CREDENTIALS = os.environ.get('GOOGLE_APPLICATION_CREDENTIALS')
PASS_CREDENTIALS =
service_account.Credentials.from_service_account_file(GET_CREDENTIALS)
YOUTUBE_API_SERVICE_NAME = "youtube"
YOUTUBE_API_VERSION = "v3"
DEVELOPER_KEY = "mykey"
youtube = build(YOUTUBE_API_SERVICE_NAME, YOUTUBE_API_VERSION, credentials=PASS_CREDENTIALS,
developerKey=None)
# Call the search.list method to retrieve results matching the specified
# query term.
search_response = youtube.search().list(
q=track_name,
part="id,snippet",
#maxResults=track_name.max_results
).execute()
videos = []
videos_ids = []
channels = []
playlists = []
# Add each result to the appropriate list, and then display the lists of
# matching videos, channels, and playlists.
for search_result in search_response.get("items", []):
if search_result["id"]["kind"] == "youtube#video":
videos.append("%s (%s)" % (search_result["snippet"]["title"],
search_result["id"]["videoId"]))
videos_ids.append("%s" % (search_result["id"]["videoId"]))
elif search_result["id"]["kind"] == "youtube#channel":
channels.append("%s (%s)" % (search_result["snippet"]["title"],
search_result["id"]["channelId"]))
elif search_result["id"]["kind"] == "youtube#playlist":
playlists.append("%s (%s)" % (search_result["snippet"]["title"],
search_result["id"]["playlistId"]))
print ("Videos:\n", "\n".join(videos), "\n")
print ("Channels:\n", "\n".join(channels), "\n")
print ("Playlists:\n", "\n".join(playlists), "\n")
ids=[]
for video in videos:
artist = re.split(r'\s*-\s*', video)[0]
id = re.search(r'.*\(([^)]+)', video)[1]
if id and artist == target_artist:
videos_ids.append(id)
print ('VIDEOS IDS', videos_ids)
return videos_ids[-1]
5 Réponses :
Peut-être, ce qui suit pourrait être un peu plus proche: p> Juste au cas où, vous aurez peut-être eu un nombre inconnu d'espaces, alors nous prenions des avantages de sortie h3>
< p> Si vous souhaitez simplifier / modifier / explorer l'expression, il a été expliqué sur le panneau supérieur droit de Regex101.com . Si vous le souhaitez, vous pouvez également regarder dans Ce lien , comment cela correspondrait Contre quelques échantillons d'entrée. P>
Méthode 2 H2>
re.split () code>: p>
sortie h3>
Vous sortie vidéo [0] code>, il devrait être le dernier élément en fonction de l'OP
Et ici l'identifiant, qui est toujours le dernier article i> Votre code ne saisit pas le dernier élément.
Lorsque vous divisez l'artiste de la piste, vous fractionnez sur La solution consiste à '-' code>. Si vous regardez les chaînes réelles, vous verrez qu'il y a une espace blanche autour de l'union d'union, qui sera incluse dans le résultat scindinal. P>
.Strip () code> L'artiste code> variable pour se débarrasser de la blancheur. P>
Vous pouvez modifier votre code ci-après, fixant le problème de la division et saisir l'ID (ou quoi que ce soit entre la parathèse): sortie: p> Si votre sortie souhaitée est juste regardant Les données plus étroitement, il n'est pas toujours précis exactement lorsque le nom de l'artiste se produit (comme pour Linkin Park et Lagola) afin que l'approche actuelle présente des défauts qui ne soient pas adressés dans aucune des réponses p> p> VG1JYL3CR60 CODE> Comme indiqué dans l'OP, vous voudrez casser la boucle une fois que le premier identifiant est imprimé p>
re.search code> obtiendra le premier élément - le dernier élément est recherché.
"Regardant les données plus étroitement, il n'est pas toujours clair exactement lorsque le nom de l'artiste se produit (comme pour Linkin Park et Lagola) afin que l'approche actuelle a des défauts qui ne soient pas adressés dans aucune des réponses" Je suis un bon point, surpris que personne d'autre ne l'ait mentionné. Nous avons besoin d'une sorte de clarification de l'OP.
pense que tout le monde (y compris moi-même) s'est rattrapé pour le faire fonctionner pour l'exemple spécifique: D
Le problème que vous rencontrez est principalement dû à un espace présent à la fin de votre match (puisque J'ai aussi nettoyé certaines des autres parties de votre code. J'ai ajouté La dernière partie vérifie la dernière partie pour voir si - code> scissure sur
- code> et laisse l'espace derrière elle) . Tcode ci-dessous devrait fonctionner pour vous. Il utilise
re.split code> pour scinder sur
\ s *-\ s * code> (n'importe quel nombre d'espaces, suivi de
- code>, suivi d'un numéro des espaces).
. * Code> au début de votre deuxième regex pour capturer uniquement la dernière instance (et modifié
[0] code> sur
[1] code> pour obtenir Le contenu capturé au lieu de tout le match). p>
ID code> existe et si
artiste == cible code> avant l'impression.
Vg1jyL3cr60
WQYsGWh_vpE
\ s * - \ s * code> Ce modèle correspond
- code> et n'importe quel blancheur autour d'eux
\ s * code> correspond à n'importe quel caractère de blanchiment n'importe quel nombre de fois li>
- code> correspond à ce caractère littéralement li>
\ s * code> correspond à n'importe quel caractère de blanchiment n'importe quel nombre de fois li>
ul> li>
. * \ ((([^)] +) code> Ce modèle correspond à la dernière instance de la parenthèse gauche dans une chaîne
. * code> correspond à n'importe quel caractère de fois (c'est ainsi que nous pouvons nous assurer que nous assurerons la dernière parenthèse car il est gourmand et correspondra autant de caractères possible) LI>
\ ( code> correspondez
( code> littéralement li>
([^)] +) code> capture les éléments suivants
[^)] + code> correspond à un ou plusieurs de n'importe quel caractère sauf
) code> li>
ul> li>
ul> li>
ul> p>
Pouvez-vous expliquer votre artiste Regex? Je ne suis pas sûr de le comprendre complètement.
Sur la chaîne "Besoin de vitesse (Linkin Park - Roads Untraveled) Vidéo musicale (7LKQ7BF6KU8)", le code ne produira pas de manière incorrecte "besoin de vitesse (Linkin Park" pour le nom de l'artiste?
@ Alexandercémécile Oui, mais votre question ne couvre pas ce cas (et quel est le résultat attendu pour cette chaîne.
Quelle question?
@ Alexandercécile Désolé, cette question. Selon l'OP, la cible est avant le premier - code>
Hein, il ne le dit pas, il semble juste de cette façon à cause de son code. Son code est vraiment brisé et la chaîne que j'ai partagée est un contre-exemple parfait, alors j'espère qu'il finit par expliquer les choses un peu plus. Jusque-là, nous ne pouvons pas être certains, malheureusement. Tant pis!
D'accord, voici un exemple de travail complet avec une nouvelle regex. Il extrait l'identifiant de la vidéo, le nom / le titre, et c'est tout. Je voulais éviter de faire un tas d'hypothèses sur le format du titre de la vidéo, car il semble ne suivre aucun modèle ou format particulier.
laissez-moi savoir si vous avoir d'autres questions! :) p> p>
très agréable. Mais l'esprit que, dans la question, j'ai besoin d'une solution qui passe un artiste cible et renvoie seulement l'ID vidéo i> pour tout identifiant vidéo concernant cette cible. Dans l'exemple ci-dessus, passez à Portishead comme un argument et retourne un identifiant vidéo pour cet artiste. J'accepterais et évite si vous encapsulez cela dans une fonction qui passe la cible et l'identifiant de retour si l'artiste est trouvé.
@Data_garden Comment pouvons-nous extraire / identifier le nom de l'artiste de manière cohérente? Pour autant que je sache, les titres ne suivent aucun modèle qui rendrait cela possible.
@Data_Garden aurait dû préciser que mon commentaire est basé sur la quantité limitée d'informations partagées dans votre message. Selon l'endroit où les données proviennent, le reste de votre programme et son objectif, etc., il pourrait y avoir une solution.
Nous passons le nom du artiste. C'est pourquoi c'est cible et que «pourquoi j'ai utilisé comme conditionnement. qui suffit pour cette question
Comme pour l'élément dans vid_info_lst: si cible_artiste dans l'élément [0]: Imprimer (Item [1]) Code>
où cible_artiste = 'Portishead' code>
@Data_Garden Laissez-moi reformuler ma question: Comment vérifions-nous uniquement un nom d'artiste et le titre d'une vidéo, que l'artiste a créé / correspond à cette vidéo. Par exemple, qui est l'artiste de ce titre: "Besoin de vitesse (Linkin Park - Roads non construits) Vidéo musicale (KD3S20GMPVE)" C'est une question triviale pour un être humain et un extrêmement difficile pour un ordinateur. Le code que vous venez de partager utilise une vérification de sous-chaîne simple, qui est malheureusement incroyablement inefficace.
Laissez-nous Continuez cette discussion en chat .
Je suppose que cela devrait être
item.split ('-') code>
ID d'impression code> ->
impression (id) code>
D'où vient votre liste? Vous mentionnez des performances et qu'il est assez important, il va donc déterminer la meilleure solution.
@ Alexandercélile python2?
Python3.7, monsieur.
@ Dekekeden toujours une possibilité, mais improbable imo.
Si vous n'utilisez pas de crochets dans la déclaration d'impression et que vous allez terminer.