[PYTHON] Depuis que je suis libre, je fais l'acquisition de texte "RPA tool" # 4 édition sélénium

introduction

Tout le monde, je pense que j'ai pu poster tôt cette fois. C'est enp. Je veux avoir une romance. Cet article est un rapport d'étape pour quiconque essaie de créer un "outil RPA". Veuillez noter qu'il ne décrit pas comment créer des outils RPA ou RPA. (Peut-être que je vais mettre un peu de sauce dessus. Cela dépend de mon humeur) Cette fois, c'est la partie 2 pour s'entendre avec le sélénium. Ce que j'ai fait, c'est «convertir l'adresse en code postal» et «convertir le code postal en adresse». Ce sera encore un long article, mais je vous serais reconnaissant si vous pouviez vous entendre avec moi.

Je veux juste avoir le texte! !!

Oui. Le titre est juste ça. Je veux obtenir les caractères écrits sur le blog et les caractères écrits sur Wikipedia. Voilà pour cet article. __ Alors pourquoi essayez-vous d'obtenir un code postal à partir de votre adresse? __ Ce sera. C'est __ parce que c'était un code postal en raison de mes préjugés et de mon examen arbitraire des informations sur Internet nécessaires au travail. Je pense qu'il y a d'autres informations dont vous avez besoin sur Internet selon votre travail. Cependant, j'ai pensé que je chercherais le code __postal quel que soit le contenu du poste. __ C'est juste mon préjugé. __ Cela inclut également la simple raison que __ a beaucoup de texte à gérer. __ Alors pourquoi essayez-vous d'obtenir une adresse à partir d'un code postal? __ Il vous suffit de connaître le code postal à partir de l'adresse. C'est vrai. Cependant, cela peut être gênant sans la fonction inverse. __ De plus, __ je ne pourrais pas m'installer sans la fonction inverse. __ Donc, cette fois, nous avons implémenté deux fonctions, __ "Conversion d'adresse en code postal" __ et __ "Conversion de code postal en adresse" __.

(Pour être clair, si vous le recherchez, je pense qu'il existe une bibliothèque qui gère les adresses et les codes postaux. Cependant, cette fois, nous allons l'implémenter pour l'apprentissage du sélénium, donc nous ne chercherons pas d'adresses dans la bibliothèque. Implémentez-la avec du sélénium Aller)

Tout d'abord, connaissons les spécifications du site

Si vous ne connaissez pas les spécifications du site, il n'y a pas de spécifications d'implémentation. Alors, apprenons la recherche par code postal, etc. Tout d'abord, il s'agit de rechercher une adresse à partir d'un code postal. 郵便番号検索.png Ce qui précède est la barre de recherche pour la recherche par code postal. Eh bien, si vous mettez le code postal dans la zone de texte et appuyez sur le bouton, vous avez terminé. Facile à comprendre. Alors qu'en est-il après la recherche? 郵便番号検索後.png Il sera affiché comme ceci. Il semble que vous puissiez l'obtenir en extrayant l'adresse de la table.

Vient ensuite la recherche du code postal à partir de l'adresse. 住所検索.png Soit dit en passant, ce qui est inquiétant ici, c'est le __ choix des préférences __. La mise en œuvre de la sélection avec du sélénium semble un peu intimidante. Cependant, le bureau de poste japonais est très gentil. Vous pouvez également effectuer une recherche en saisissant toutes les adresses requises dans les champs de saisie des villes, quartiers, villes et villages. __ Je vous remercie. Voyons s'il faut émettre une carte du Nouvel An cette année. Personne ne l'envoie. Après la recherche, ce sera comme suit. 住所検索後.png Le code postal n'est pas répertorié. Et si je clique sur une adresse dans le quartier de la ville? ボタンを押した後.png Cela ressemble à ce qui précède. Le code postal sort enfin ici. La conversion d'une adresse en code postal prendra plus de temps.

Ce qui précède est les spécifications du site.

(Nous l'appliquerons en supposant qu'il n'y a pas d'autres candidats après la recherche. Si vous effectuez une recherche par code postal, l'adresse à laquelle le code postal correspond doit être fixée. Même dans la recherche d'adresse, si vous n'effectuez pas une recherche ambiguë, elle doit être décidée comme une seule. Lorsque vous effectuez une recherche ambiguë, je pense qu'elle n'est pas "automatisée" car la recherche est effectuée sur la "prémisse que l'utilisateur sélectionne". Décidé de ne pas soutenir)

Limites d'acquisition d'éléments

Ensuite, implémentons-le immédiatement! Je voudrais dire qu'il y avait un problème ici. Jusqu'à présent, vous utilisiez le nom d'attribut de l'élément __ pour saisir des caractères dans la zone de texte ou cliquez sur un bouton. __ (Les éléments sont des divs et des entrées, et les attributs sont des classes et des identifiants) Mais que se passe-t-il si le nom __attribute est utilisé dans plusieurs éléments? __ Par exemple, lorsque le nom sample est utilisé pour divers divs de la classe. Dans ce cas, vous ne pourrez pas localiser exactement où vous voulez taper ou cliquer. __ Lorsque vous souhaitez spécifier un élément par nom d'attribut, vous utilisez le nom d'id ou le nom de nom, mais il n'y a aucune garantie que l'id ou le nom soit utilisé. En outre, vous n'utilisez peut-être pas le nom d'attribut. Vous pouvez le spécifier en utilisant le nom de l'élément, mais les pages Web utilisent souvent un élément appelé div, qui ne convient pas pour en identifier un. __ Alors que dois-je faire! !! __ </ font> __ Dans ce cas, utilisez XPath. __ __XPath? Qu'est-ce que c'est? Bande? __ Vous pourriez penser cela. Cette personne imagine peut-être X JAPAN. Donc, dans la section suivante, je vais expliquer brièvement XPath.

Qu'est-ce que XPath?

XPath est simplement l'adresse __ de l'élément __. Expliquons avec un petit échantillon.

<html>
  <head>
    <title>Sample HTML</title>
  </head>
  <body>
    <h1>Exemple HTML</h1>
    <p>This is HTML Sample.</p>
    <p>This is HTML Sample.</p>
  </body>
</html>

Ce qui précède est un exemple de programme HTML. Il exagère qu'il s'agit d'un échantillon. Je n'explique pas le HTML, je vais donc omettre de quel type de HTML il s'agit. __ L'important est que certains attributs ne soient pas utilisés et que certains éléments soient utilisés. __ Maintenant, j'ai une question pour vous. Cela ne ressemble-t-il pas à un morceau avec __ <○○> </ ○○>? __ __ Du point de vue, on a l'impression qu'il y a un corps dans le html. Ce sentiment est XPath. __ Lorsque vous entendez le deuxième p dans le corps du html, est-ce la 8e ligne du programme d'exemple? Vous devez comprendre d'une manière ou d'une autre. La même chose peut être faite avec le sélénium. __ Alors comment l'écrivez-vous? __ </ font> Si vous ne pouvez pas écrire en caractères, vous ne pouvez pas écrire dans le programme. La façon de l'écrire est la suivante.

/html/body/p[2]

Ce que je dis est le même qu'avant. Il pointe vers "le deuxième p du corps en html". Cependant, il est difficile d'écrire à partir de HTML un par un. Cela peut être possible si tout le HTML est aussi court que l'exemple, mais s'il est long, ce sera déroutant. Par conséquent, vous pouvez omettre XPath jusqu'à la partie requise avec "//". __ C'est l'explication de XPath. Si vous souhaitez en savoir plus, veuillez le vérifier vous-même.

La mise en oeuvre!

Maintenant, implémentons-le. Le programme est le suivant.

#Import de bibliothèque
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
import psutil
import re

#Entrez le code postal ou l'adresse
postHint = input("Code postal ou adresse:")

#Importation de pilote
chrome = webdriver.Chrome(r".\driver\chromedriver.exe")

#Aller à la page de recherche de code postal JP
chrome.get("https://www.post.japanpost.jp/zipcode/")

#Succursale conditionnelle de "Code postal à adresse" ou "Adresse à code postal"
while True :
    if re.fullmatch("((\d{3})-(\d{4}))|(\d+)", postHint) : #Lors de la recherche d'une adresse par code postal
        if re.fullmatch("(\d{3})-(\d{4})", postHint) : # -Si c'est le cas-Effacer
            postNumber = postHint.replace("-", "")
        else :
            postNumber = postHint

        #Rechercher une adresse par code postal
        textarea = chrome.find_element_by_name("zip") #Zone de texte pour saisir le code postal
        textarea.send_keys(postNumber) #Entrez le code postal
        textarea.send_keys(Keys.ENTER) #Déterminé par entrer

        #Obtenez une adresse
        ken = chrome.find_element_by_xpath("//table[@class='prefList sp-b10']/tbody/tr[2]/td[2]/small").get_attribute("textContent")
        si = chrome.find_element_by_xpath("//table[@class='prefList sp-b10']/tbody/tr[2]/td[3]/small").get_attribute("textContent")
        machi = chrome.find_element_by_xpath("//table[@class='prefList sp-b10']/tbody/tr[2]/td[4]/div/p/small/a").get_attribute("textContent")

        #Combiner les adresses
        address = ken + si + machi
        
        #résultat
        print("Résultats de recherche:" + address)

        #Sortez de la boucle
        break

    elif re.fullmatch(".+?Préfecture.+?\d*?-?\d*?-?\d*?-?\d*?-?\d*?", postHint) : #De l'adresse au code postal
        #Supprimer la partie numérique de l'adresse
        if re.search("\d", postHint) :
            postAddress = re.sub("\d+?-?\d*?-?\d*?-?\d*?-?\d*?", "", postHint)
        else :
            postAddress = postHint

        #Rechercher le code postal à partir de l'adresse
        textarea = chrome.find_element_by_name("addr") #Zone de texte pour saisir une adresse
        textarea.send_keys(postAddress)
        textarea.send_keys(Keys.ENTER)

        #Attendez 1 seconde (car le traitement du navigateur ne peut pas rattraper)
        time.sleep(1)

        #Obtenez le code postal
        button = chrome.find_element_by_xpath("//table[@class='prefList sp-b10']/tbody/tr[2]/td[2]/div/p/a") #Obtenez le lien
        button.click()
        addressNumber = chrome.find_element_by_xpath("//table[@class='zip-detail']/tbody/tr[2]/td[1]/span").get_attribute("textContent")

        #Sortie de résultat
        print("Résultats de recherche:" + re.sub("\s*?", "", addressNumber))

        #Sortez de la boucle
        break

    else :
        postHint = repr(input("Code postal ou adresse:"))

p = psutil.Process(chrome.service.process.pid)
p.terminate()

Cela peut être un peu difficile à voir car j'ai désactivé la coloration syntaxique. Cependant, lorsque j'ai activé les surbrillances de syntaxe, c'était plus difficile à voir, donc je l'ai désactivé. Il y a quelque chose de mieux que le sommeil pour le traitement en veille, mais cette fois je l'ai fait dormir. Il n'y a pas de raison particulière. Parce que ce n'est pas le sujet principal. Le programme est facile à réaliser. Recherchez et obtenez des informations. c'est tout! Facile! Cependant, ce programme présente deux inconvénients fatals. __ Je n'ai pas géré l'erreur en premier lieu. À proprement parler, il n'y en a pas deux.

Eh bien, __ inconvénient fatal Le premier est que lors de la recherche par adresse, s'il y a des candidats, ce sera bogué __. Les candidats peuvent apparaître même si toutes les adresses sont saisies correctement. Dans ce cas, le code postal correct peut ne pas être sorti. __ La cause est que XPath sélectionne le premier choix. __ On peut dire que c'est un bug parce que c'était censé être une situation où il n'y a pas d'autre que le premier candidat. Une solution consiste à comparer l'adresse de chaque candidat avec l'adresse saisie par l'utilisateur.

__ Le deuxième inconvénient fatal est les expressions canoniques de recherche d'adresse lâche. __ __ L'expression régulière en question est ". +? Préfecture. +? \ D *? -? \ D *? -? \ D *? -? \ D *? -? \ D *?". __ __ Caractères déformés? Ce sont les personnages auxquels vous pourriez penser un instant. Je n'expliquerai pas l'expression régulière, mais __ cela signifie "OK s'il y a un caractère après XX préfecture" __. __ En d'autres termes, je reconnais qu'il est correct d'écrire «Sakura dans la préfecture de Kumamoto». Le "Marukenka" ultime est OK. __ __ Cependant, il ne recherche pas les éléments qui ne sont pas "○○ prefecture" tels que "Tokyo" et "Kyoto prefecture". __ C'est trop bâclé pour en parler. Bien sûr, si vous recherchez et que rien n'est frappé, une erreur sera générée et le programme se terminera. __ La raison pour laquelle les expressions régulières sont bâclées est que la manière d'écrire une adresse diffère selon la préfecture. S'il y a ○○ préfecture ○○ ville ○○, ○○ préfecture ○○ ville ○○ quartier ○○, ○○ préfecture ○○ groupe ○○, etc. Il est impossible d'enquêter et de répondre à tous. Vous pourrez peut-être le faire si vous avez une sorte de liste. Cependant, pour le moment, il n'y a pas d'autre moyen que de le rechercher individuellement, c'est donc devenu une expression régulière bâclée. __ De plus, j'ai simplement oublié le problème de ne pas chercher Tokyo. __Je suis désolé.

Ce que vous devez faire pour mettre en œuvre l'outil RPA

En passant, je voudrais énumérer le contenu lié à la mise en œuvre en fonction de l'expérience jusqu'à présent. Voici les bulletins.

--_ Il y a une limite si XPath ne peut pas être utilisé pour obtenir des éléments __ --_ J'ai besoin d'expliquer ce qu'est XPath pour ceux qui ne peuvent pas programmer __ --_ Pour ceux qui ne peuvent pas programmer, il est nécessaire de concevoir comment écrire XPath __ --__ Cela peut ne pas fonctionner correctement sans traitement en veille __ --_ J'ai senti que la gamme de RPA serait plus large si le branchement conditionnel et la répétition étaient possibles __ --_ À propos de la répétition C'est pratique si vous pouvez utiliser la pause, etc. __ --_ Vous devriez pouvoir utiliser des expressions régulières __ --_ J'ai besoin d'expliquer ce qu'est une expression régulière pour ceux qui ne peuvent pas programmer __ --_ Pour ceux qui ne savent pas programmer, il est nécessaire de concevoir comment écrire des expressions régulières __ --_ Il est préférable d'utiliser get_attribute ("textContent") pour obtenir le texte __ --_ Je veux aussi une fonction pour combiner des chaînes de caractères __ --__ Si vous ne gérez pas correctement l'erreur, elle se cassera bientôt __

C'est tout ce que je peux penser pour le moment. Parce que get_attribute ("textContent") peut également obtenir des caractères qui ne sont pas affichés dans le navigateur Je pense qu'il sera plus difficile de lancer des erreurs.

finalement

Merci de rester avec nous jusqu'à la fin. Je pense que je peux bien m'entendre avec le sélénium cette fois. Cependant, il y a quelque chose que je veux faire avec le sélénium à la fin, donc l'édition sélénium se poursuivra pendant un certain temps. Je pense que le prochain article sera "Entendons-nous avec le sélénium Part.3", donc merci. C'est tout pour enp.

Recommended Posts