90550


seleniumを使って、yahoo newsのwebサイトからURLを抽出して  
IDのみ取得したいです。

**実現したい内容**  
❶からURLを取得してから、❷IDのみ取得したいです。

❶URL取得

[code]

    ['https://news.yahoo.co.jp/pickup/6435551']
    ['https://news.yahoo.co.jp/pickup/6435550']
    ['https://news.yahoo.co.jp/pickup/6435548']
    ['https://news.yahoo.co.jp/pickup/6435547']
    
[/code]

❷ID取得

[code]

    ['6435551'、'6435550'、'6435548'、'6435547']
    
[/code]

現在は下記のコードで❶までのURLを取得できますが、  
❷のID取得できません。  
実現の結果のprint(new_list)のように[]空白として出力されます。  
スライス方法が間違っていいますでしょうか。

もし分かる方がいましたら、教えていただけると幸いです。  
お手数ですが、よろしくお願い致します。

**現在の結果**  
print(data_list)  
※一部省略

[code]

    ['https://www.yahoo.co.jp/']
    ['https://support.yahoo-net.jp/PccNews/s/']
    ['https://news.yahoo.co.jp/']
    ['https://news.yahoo.co.jp/ranking/access/news']
    ['https://news.yahoo.co.jp/paidnews?source=pc-common-glonav']
    ['https://news.yahoo.co.jp/']
    ['https://news.yahoo.co.jp/categories/domestic']
    ['https://news.yahoo.co.jp/categories/world']
    ['https://news.yahoo.co.jp/categories/business']
    ['https://news.yahoo.co.jp/categories/entertainment']
    ['https://news.yahoo.co.jp/categories/sports']
    ['https://news.yahoo.co.jp/categories/it']
    ['https://news.yahoo.co.jp/categories/science']
    ['https://news.yahoo.co.jp/categories/life']
    ['https://news.yahoo.co.jp/categories/local']
    ['https://news.yahoo.co.jp/topics/top-picks']
    ['https://news.yahoo.co.jp/topics']
    ['https://news.yahoo.co.jp/topics/top-picks']
    ['https://news.yahoo.co.jp/topics/top-picks']
    ['https://news.yahoo.co.jp/topics/domestic']
    ['https://news.yahoo.co.jp/topics/world']
    ['https://news.yahoo.co.jp/topics/business']
    ['https://news.yahoo.co.jp/topics/entertainment']
    ['https://news.yahoo.co.jp/topics/sports']
    ['https://news.yahoo.co.jp/topics/it']
    ['https://news.yahoo.co.jp/topics/science']
    ['https://news.yahoo.co.jp/topics/local']
    ['https://news.yahoo.co.jp/pickup/6435551']
    ['https://news.yahoo.co.jp/pickup/6435550']
    ['https://news.yahoo.co.jp/pickup/6435548']
    ['https://news.yahoo.co.jp/pickup/6435547']
    ['https://news.yahoo.co.jp/pickup/6435546']
    ['https://news.yahoo.co.jp/pickup/6435545']
    ['https://news.yahoo.co.jp/pickup/6435544']
    ['https://news.yahoo.co.jp/pickup/6435542']
    ['https://news.yahoo.co.jp/pickup/6435543']
    ['https://news.yahoo.co.jp/pickup/6435541']
    ['https://news.yahoo.co.jp/pickup/6435539']
    ['https://news.yahoo.co.jp/pickup/6435538']
    ['https://news.yahoo.co.jp/pickup/6435537']
    ['https://news.yahoo.co.jp/pickup/6435535']
    ['https://news.yahoo.co.jp/pickup/6435534']
    ['https://news.yahoo.co.jp/pickup/6435532']
    ['https://news.yahoo.co.jp/pickup/6435533']
    ['https://news.yahoo.co.jp/pickup/6435531']
    ['https://news.yahoo.co.jp/pickup/6435530']
    ['https://news.yahoo.co.jp/pickup/6435528']
    ['https://news.yahoo.co.jp/pickup/6435527']
    ['https://news.yahoo.co.jp/pickup/6435524']
    ['https://news.yahoo.co.jp/pickup/6435525']
    ['https://news.yahoo.co.jp/pickup/6435526']
    ['https://news.yahoo.co.jp/pickup/6435521']
    ['https://news.yahoo.co.jp/topics/top-picks?page=2']
    ['https://www.facebook.com/yjnews']
    ['https://twitter.com/YahooNewsTopics']
    ['https://news.yahoo.co.jp/newshack/']
    ['https://news.yahoo.co.jp/']
    ['https://news.yahoo.co.jp/flash']
    ['https://news.yahoo.co.jp/live']
    ['https://news.yahoo.co.jp/info/commercial-transactions']
    ['https://support.yahoo-net.jp/voc/s/news']
    ['https://support.yahoo-net.jp/PccNews/s/']
    
    
[/code]

print(l_in)  
※一部省略

[code]

    []
    []
    []
    []
    []
    []
    []
    []
    []
    []
    []
    ['https://news.yahoo.co.jp/pickup/6435552']
    ['https://news.yahoo.co.jp/pickup/6435551']
    ['https://news.yahoo.co.jp/pickup/6435550']
    ['https://news.yahoo.co.jp/pickup/6435548']
    ['https://news.yahoo.co.jp/pickup/6435547']
    ['https://news.yahoo.co.jp/pickup/6435546']
    ['https://news.yahoo.co.jp/pickup/6435545']
    ['https://news.yahoo.co.jp/pickup/6435544']
    ['https://news.yahoo.co.jp/pickup/6435542']
    ['https://news.yahoo.co.jp/pickup/6435543']
    ['https://news.yahoo.co.jp/pickup/6435541']
    ['https://news.yahoo.co.jp/pickup/6435539']
    ['https://news.yahoo.co.jp/pickup/6435538']
    ['https://news.yahoo.co.jp/pickup/6435537']
    ['https://news.yahoo.co.jp/pickup/6435535']
    ['https://news.yahoo.co.jp/pickup/6435534']
    ['https://news.yahoo.co.jp/pickup/6435532']
    ['https://news.yahoo.co.jp/pickup/6435533']
    ['https://news.yahoo.co.jp/pickup/6435531']
    ['https://news.yahoo.co.jp/pickup/6435530']
    ['https://news.yahoo.co.jp/pickup/6435528']
    ['https://news.yahoo.co.jp/pickup/6435527']
    ['https://news.yahoo.co.jp/pickup/6435524']
    ['https://news.yahoo.co.jp/pickup/6435525']
    ['https://news.yahoo.co.jp/pickup/6435526']
    []
    []
    []
    []
    []
    []
    []
    []
    []
    []
    []
    []
    []
    []
    []
    []
    []
    []
    []
    
[/code]

**print(new_list)**  
※一部省略

[code]

    []
    []
    []
    []
    []
    []
    []
    []
    []
    []
    []
    
[/code]

コード

[code]

    from selenium.webdriver.common.keys import Keys
    import time
    from selenium.webdriver.chrome.options import Options
    from selenium.webdriver.support.select import Select  
    from selenium import webdriver
    from webdriver_manager.chrome import ChromeDriverManager
    from selenium.webdriver.common.keys import Keys
    from selenium.common.exceptions import NoSuchElementException
    
    option = Options()
    
    #ログイン情報を維持するための設定　
    # 参考→https://rabbitfoot.xyz/selenium-chrome-profile
    PROFILE_PATH ="C:\\Users\\test\\AppData\\Local\\Google\\Chrome\\User Data\\" # 変更
    option.add_argument('--user-data-dir=' + PROFILE_PATH)
    option.add_argument('--profile-directory=Default')
    #Getting Default Adapter failed error message
    option.add_experimental_option('excludeSwitches', ['enable-logging'])
    
    # ブラウザを開く設定
    driver = webdriver.Chrome(executable_path=ChromeDriverManager().install() ,options=option)
    
    #news.yahoo URL
    URL= "https://news.yahoo.co.jp/"
    
    # URLを開く。
    driver.get(URL)
    
    #待機時間
    time.sleep(3)
    
    while True:
        try:
            #ボタンクリック top25まで
            button = driver.find_element_by_xpath('//*[@id="uamods-topics"]/div/div/div/div/p[1]/a')
            button.click()
    
            #待機時間
            time.sleep(3)
    
        except NoSuchElementException:
            break
    
    
    #待機時間
    time.sleep(3)
    
    #全てのURLを抽出
    elements = driver.find_elements_by_xpath("//a[@href]")
    for element in elements:
        list=element.get_attribute("href")
    
    
        #URLをリストとして作成
        data_list = list.splitlines()
        #print(data_list)
    
        #URLに含んでいるpickupのURLのみ　出力
        l_in = [s for s in data_list if 'pickup' in s]
        #print(l_in)
    
        #IDを取得
        new_list=l_in[32:]
        print(new_list)
    
[/code]


CC BY-SA 4.0
2022-08-13T11:01:24.763
90547
2022-08-13T18:07:03.147
18859
question
python python3 selenium
PythonでURLのリストから特定のIDを抽出したい


下記でどうでしょうか？

[code]

    for element in elements:
        href=element.get_attribute("href")
        if 'pickup' in href:
            print(href[32:])
    
[/code]


CC BY-SA 4.0
2022-08-13T13:02:13.037
90548
2022-08-13T13:02:13.037
39819
90547
answer

[code]

    #URLに含んでいるpickupのURLのみ出力
    l_in = [s.split('/')[-1] for s in data_list if 'pickup' in s]
    
[/code]


CC BY-SA 4.0
2022-08-13T13:14:53.620
90549
2022-08-13T13:14:53.620
47127
90547
answer


今の処理では得られた`l_in`がリストであり、その中にURLの文字列が1個入っているか空(0個)なのですから、文字列が入っている場合は`[32:]`ではなく`[0][32:]`になります。

質問の中の`print(l_in)`結果例の抜粋：

[code]

        ....
    []
    []
    ['https://news.yahoo.co.jp/pickup/6435552']
    ['https://news.yahoo.co.jp/pickup/6435551']
        ....
    []
    []
    
[/code]

それまでの段階的な処理を生かしておいて、少ない改造で実現する場合は以下のようになるでしょう。  
この部分を：

[code]

        #IDを取得
        new_list=l_in[32:]
        print(new_list)
    
[/code]

こうすれば、`ID`が得られると思われます。

[code]

        #IDを取得
        if l_in:
            new_list=l_in[0][32:]
            print(new_list)
    
[/code]

ただし固定の桁数で切り出すのはあまり良い処理とは言えないので、正規表現とか @metropolis
さん回答のように理解しやすい文字で切り分ける方が良いでしょう。

それから変数名は`new_list`になっていますが上記処理で取り出せるのはリストではなく個々の`ID`ですね。  
最終的に`IDのリスト`が欲しい(@merino さん @metropolis
さんの回答にコメントしたように)のならば取得したその位置で表示するのではなく以下のようにいったんリストに追加してからループを抜けた後で表示することです。

[code]

    new_list = []  #### 空のリストを定義して初期化
    for element in elements:
        list=element.get_attribute("href")
    
        #URLをリストとして作成
        data_list = list.splitlines()
        #print(data_list)
    
        #URLに含んでいるpickupのURLのみ　出力
        l_in = [s for s in data_list if 'pickup' in s]
        #print(l_in)
    
        #IDを取得
        if l_in:
            new_list.append(l_in[0][32:])  #### ループ内ではリストに追加するだけ
    
    print(new_list)  #### ループ終了後にまとめて表示
    
[/code]

* * *

ちなみにseleniumの4.3.0以後だと`find_element_by_**`や`find_elements_by_**`が削除されるようです。  
[AttributeError: 'WebDriver' object has no attribute
'find_element_by_xpath'](https://stackoverflow.com/q/72754651/9014308)

なので使うselenium版数を新しくした場合は以下の行等を変更する必要があるでしょう。

[code]

            #ボタンクリック top25まで
            button = driver.find_element_by_xpath('//*[@id="uamods-topics"]/div/div/div/div/p[1]/a')
    
[/code]

[code]

    #全てのURLを抽出
    elements = driver.find_elements_by_xpath("//a[@href]")
    
[/code]


CC BY-SA 4.0
2022-08-13T15:50:39.340
90550
2022-08-13T18:07:03.147
2022-08-13T18:07:03.147
26370
26370
90547
answer