souwasora
@souwasora (takei souwa)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Python selenium 同じclass名

解決したいこと

最近seleniumの勉強を始め、適当に求人サイトの会社名を取り出して、Googleで検索かけて会社の住所を取得を考えております。
しかし、電話番号と住所のclassが一致してる部分があり
同時に取得できてしまいます。
解決したい事として
①同時に取得した電話番号、住所をappendする際に別々の配列に入れる
②会社の住所だけ取得したいので、何か方法を考える

adres = browser.find_elements_by_class_name('LrzXr')

発生している問題・エラー

〒150-0001 東京都渋谷区神宮前2丁目33−16 #601
03-6459-2001
が取得できてしまっている
#画像の取得してるものとは違いますあくまでも二つ取れてしまうこと
スクリーンショット 2022-11-06 14.39.02.png
image.png
image.png

該当するソースコード

import pandas
import requests
import time
from bs4 import BeautifulSoup
import csv
import pandas as pd
from webdriver_manager.chrome import ChromeDriverManager
from selenium import webdriver
from time import sleep
browser = webdriver.Chrome(ChromeDriverManager().install())
# Steam
url =  'https://townwork.net/joSrchRsltList/?sac=52102&jc=001&emc=01&emc=06&page=1'
browser.get(url)
res = requests.get(url)
#parser = 分割的な意味
soup = BeautifulSoup(res.text, 'html.parser',from_encoding='utf-8')
page_count = 1
page = soup.find_all('ol', attrs={'class': 'pager-number'})

p = soup.find('span', attrs={'class': 'hit-num'})
p = int(p.text.replace(',',''))
p = -(-p // 30)
lists = []
adress = []
while True:
    res = requests.get(url)
    soup = BeautifulSoup(res.text, 'html.parser',from_encoding='utf-8')
    title = soup.find_all('h3', attrs={'class': 'job-lst-main-ttl-txt'})
    click = browser.find_element_by_class_name('job-lst-main-btn-wrap')
    click.click()
    adres = browser.find_elements_by_xpath('//*[@id="js-detailArea"]/div[10]/div/dl[3]/dd/p')
    for d in adres:
        d = d.text
        adress.append(d)
        browser.back()
    for list in title:
        list = list.text
        list = list.strip()
        list = list.replace("\u3000", '')
        lists.append(list)
    page_count += 1
    time.sleep(5)
    url = 'https://townwork.net/joSrchRsltList/?sac=52102&jc=001&emc=01&emc=06&page=' + str(page_count)
    browser.get(url)
    if page_count > 1:
        break
        #except TimeoutException:
        print('pageの読み込みを終了しました')
phone_numbers = []
titles = []
adress = []
for title in lists:
    titles.append(title)
    key_word = title
    url = 'https://www.google.com/search?q=' + key_word +'電話番号'
    browser.get(url)
    #電話番号取得
    if browser.find_elements_by_class_name('X0KC1c'):
        phone_number = browser.find_elements_by_class_name('X0KC1c')
        #同時に取れてしまう
        adres = browser.find_elements_by_class_name('LrzXr')
        for d in adres:
            adres = d.text
            adress.append(adres)
        for c in phone_number:
            phone_number = c.text
            phone_numbers.append(phone_number)
        sleep(5)
        print(key_word)
        print(phone_numbers)
        print(adress)
        
    else:
        phone_numbers.append('')
        adress.append('')
        

自分で試したこと

住所だけ取得したいです
配列の1個目を取得の[0]などしましたけど、取得できず

get_attribute('aria-label')

なども試しました。。
ご教示お願いします

0

3Answer

住所だけでよいのなら先頭が「〒」かどうかで分岐してはいかがでしょうか?

adres = browser.find_elements_by_class_name('LrzXr')

ここで住所以外があって困っているなら

adres = [i for i in browser.find_elements_by_class_name('LrzXr') if i[0] == '〒']

のような感じで。

0Like

Comments

  1. @souwasora

    Questioner

    @tkey様
    WebElement' object is not subscriptable
    とのエラーが返ってきてしまいます

要素を完全一致させてから処理するか
(変数adresには住所だけが格納されるはず)

#同時に取れてしまう
- adres = browser.find_elements_by_class_name('LrzXr')
+ adres = browser.find_elements_by_css_selector('span[class="LrzXr"]')

必要そうな要素を全部取ってからIF文で必要な部分だけを抽出する
(1つ目の回答をちょっと手直ししたもの)

adres = [i.text for i in browser.find_elements_by_class_name('LrzXr') if i.text.startswith('')]
0Like

Comments

  1. @souwasora

    Questioner

    @kawagoe6884様
    ありがとうございます。
    adres = browser.find_elements_by_css_selector('span[class="LrzXr"]')
    試した気がしたのですが、、うまく行けました!

住所が書かれている

<span class="LrzXr">...</span>

と、電話番号が書かれている

<span class="LrzXr zdqRlf kno-fv">...</span>

とで、住所が書かれている方のみを取得したい場合、CSSセレクタのnot擬似クラスを用いて、

span.LrzXr:not(.zdqRlf.kno-fv)

と表現することができると思います。意味合いとしては、「span要素で、クラスLrzXrであり、クラスzdqRlf, kno-fvでないもの」となります。
実際取ってきたいページで指定されているクラスによっては、適宜変更する必要はあると思います。

0Like

Comments

  1. @souwasora

    Questioner

    ご対応ありがとうございます!!
    参考にします!

Your answer might help someone💌