74024


やりたいこと：  
Pythonでデータをクローリング(webスクレイピング)を行いたいですが、  
fullXpathやXpathで指定したものうまく読み込まないです。  
他に方法ありますでしょうか。  
また Adapter failedのエラーも表示されます。

クローリングしたいサイト（質問のみ）  
可能であれば回答がある場合クローリングもしたいです。

Yahoo知恵袋  
<https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13164627148>

取得したいテキスト

[code]

    質問
    SNSデータをクローリング(webスクレイピング)するにはpython,rubyどちらがいいか
    
    回答
    どちらでも可能ですし結果に大した違いもないでしょう。
    
    お好きな方でどうぞ、としか...
    
[/code]

こちらのコードを記載しましたが下記のように表示されます。

[code]

    # coding:utf-8
    from selenium import webdriver
    from selenium.webdriver.common.keys import Keys
    import time
    import pandas as pd
    import os
    import csv
    from time import sleep
    import sys
    
    #headless background 
    option = Options()
    option.add_argument('--headless')
    
    #Getting Default Adapter failed error message
    option.add_experimental_option('excludeSwitches', ['enable-logging'])
    
    strDate = dt.now().strftime("%Y%m%d")
    
    URL= "https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13164627148"
    
    # ブラウザを開く。 #options=option background 
    driver = webdriver.Chrome(executable_path="C:\Program Files\chromedriver_win32\chromedriver.exe",options=option)
    
    # Yahoo知恵袋の画面を開く。
    driver.get(URL)
    # 3秒待機
    time.sleep(1)
    
    #投稿内容の質問を取得
    e=driver.find_element_by_xpath('/html/body/div[1]/div[2]/div/div/div[2]/main/div/article/div/div/div')
    print(e)
    
    # ブラウザを終了する。
      driver.close()
    
[/code]

エラー内容

[code]

    DevTools listening on ws://127.0.0.1:51865/devtools/browser/7a237f7a-7326-4b73-8835-5b74a99dcb6a
    <selenium.webdriver.remote.webelement.WebElement (session="23890f416584e40e0a0ab904d3fa79b2", element="007a6033-115e-4662-8365-a7c68eef2704")>
    Traceback (most recent call last):
      File "c:/Users/test/Documents/S3/YahooQA.py", line 69, in <module>
        post = driver.find_element_by_xpath("/html/body/div[4]/div[2]/div[1]/div[3]/div[1]/div[1]")
      File "C:\Users\test\AppData\Local\Programs\Python\Python38-32\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 394, in find_element_by_xpath
        return self.find_element(by=By.XPATH, value=xpath)
      File "C:\Users\test\AppData\Local\Programs\Python\Python38-32\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 976, in find_element
        return self.execute(Command.FIND_ELEMENT, {
      File "C:\Users\test\AppData\Local\Programs\Python\Python38-32\lib\site-packages\selenium\test\remote\webdriver.py", line 321, in execute
        self.error_handler.check_response(response)
      File "C:\Users\test\AppData\Local\Programs\Python\Python38-32\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
        raise exception_class(message, screen, stacktrace)
    selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"/html/body/div[4]/div[2]/div[1]/div[3]/div[1]/div[1]"}      
      (Session info: chrome=88.0.4324.150)
    
    [15512:18424:0215/181159.096:ERROR:device_event_log_impl.cc(211)] [18:11:59.096] Bluetooth: bluetooth_adapter_winrt.cc:1072 Getting Default Adapter failed.
    
[/code]

わかる方いらっしゃいましたらご教示願います。  
お手数ですが、宜しくお願いいたします。


CC BY-SA 4.0
2021-02-15T09:30:44.353
74012
2021-02-16T15:13:07.693
2021-02-15T10:17:52.207
3060
18859
question
python xpath
Pythonでデータをクローリングについて


エラーメッセージの通り、貴方の実行環境では指定したXPATHの内容が存在しないのでしょう。

こちらで試したところでは、まず以下2行の`import`が不足して動かなかったので、質問のソースで動作していたというのならば、色々と環境や版数の違いがあるのかもしれません。

[code]

    from selenium.webdriver.chrome.options import Options
    from datetime import datetime as dt
    
[/code]

こちらの環境は以下の通り  
Windows10 64bit  
64bit python 3.9.1  
selenium 3.141.0  
Chrome 88.0.4324.150  
ChromeDriver 88.0.4324.96  
pandas 1.2.2

また結果の表示は`print(e)`ではなく`print(e.text)`で行います。

質問のXPATH:  
`'/html/body/div[1]/div[2]/div/div/div[2]/main/div/article/div/div/div'`  
動作出来るようにしたときの結果はこちら。

[code]

    ID非公開
    ID非公開さん
    2016/9/21 22:39
    1回答
    SNSデータをクローリング(webスクレイピング)するにはpython,rubyどちらがいいか
    SNSデータをクローリング(webスクレイピング)するにはpython,rubyどちらがいいか
    プログラミング | Ruby・147閲覧
    共感した
    
[/code]

回答も含められるように変更したXPATH:  
`'/html/body/div/div[2]/div/div/div[2]/main/div/article'`

ちなみに質問に書かれた「取得したいテキスト」の内容にそのまま合致するようなXPATHは無いかもしれません。  
以下のようになりました。

[code]

    ID非公開
    ID非公開さん
    2016/9/21 22:39
    1回答
    SNSデータをクローリング(webスクレイピング)するにはpython,rubyどちらがいいか
    SNSデータをクローリング(webスクレイピング)するにはpython,rubyどちらがいいか
    プログラミング | Ruby・145閲覧
    共感した
    ベストアンサー
    このベストアンサーは投票で選ばれました
    cha********
    cha********さん
    2016/9/21 22:54
    どちらでも可能ですし結果に大した違いもないでしょう。
    
    お好きな方でどうぞ、としか...
    ナイス！
    ID非公開
    ID非公開さん
    質問者
    2016/9/22 7:28
    pythonは自然言語処理（人工知能）のライブラリが豊富で強く、
    相乗的に、pythonに軍配があがると思いますが、
    どう思いますか？
    さらに返信を表示（2件）
    
[/code]

* * *

もしかしたら Jupyter notebook
とかで実行していると`print(e)`だけで取得した結果の内容が書式付きで表示されるのかもしれませんが、それは試していません。  
そういう環境であるならば、その辺の条件も質問に追記しておいた方が良いでしょう。

* * *

**コメント対応**

>
> 度々、すいません。こちら”SNSデータをクローリング(webスクレイピング)するにはpython,rubyどちらがいいか”を2回分表示されますが、1回のみ表示する方法ありますか

これは、該当記事のXPATHで取得した`html`の中で、質問の文言が`h1`タグと、その下の`div`の両方に書かれているからです。

本当にその文言だけを取得したいのなら、以下のXPATHを使えば出来ます。  
`/html/body/div/div[2]/div/div/div[2]/main/div/article/div/div/div/div[2]/div/div/div/div`

以下のようになります。

[code]

    e=driver.find_element_by_xpath('/html/body/div/div[2]/div/div/div[2]/main/div/article/div/div/div/div[2]/div/div/div/div')
    print(e.text)
    
[/code]

その代わり、質問者のID/名前、質問日時、回答件数、分類、閲覧数といったデータは取れなくなります。

またXPATHを使うやり方は、このサイトではあまり汎用性が無いかもしれません。

例えば別のこの質問で同じ内容を取得するには：  
<https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11238664036>

こちらのXPATHを指定する必要があります。  
`/html/body/div/div[2]/div/div/div[2]/main/div/article/div/div/div[1]/div[3]/div`

同様にこちらの質問の場合は：  
<https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q14238734044>

こちらのXPATHを指定する必要があります。  
`/html/body/div/div[2]/div/div/div[2]/main/div/article/div/div/div/div[2]/div/div/div[1]/div`

中には同じXPATHを使い回せる質問もあるようですが、@metropolis さん回答の方式の方が汎用性があるかもしれません。  
調べてみてください。


CC BY-SA 4.0
2021-02-15T10:09:23.757
74013
2021-02-16T12:49:02.733
2021-02-16T12:49:02.733
26370
26370
74012
answer


> 他に方法ありますでしょうか。

当該 URL の中身(HTML ソースコード)を見ますと、`window.PROPS` に JSON 形式でコンテンツが格納されている事が分かります。

[code]

      <script>
        window.PROPS = {"template":{"mastHead":...
      </script>
    
[/code]

これをパースするのに wget + GNU grep + jq を使います。

[code]

    $ wget -qO - https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13164627148 |
      grep -m1 -Po '^[ \t]*window.PROPS = \K.*$' |
      jq -r '
        "質問\n\(.preloadedState.question.questionText)\n",
        (
          .preloadedState.bestAnswer.answerItem.answerText as $best |
          select($best) | "ベストアンサー\n\($best)\n"
        ),
        .preloadedState.answer.answers as $ans |
          reduce range($ans|length) as $i("";.+"回答\($i+1)\n\($ans[$i].answerText)\n\n")
      '
    
    質問
    SNSデータをクローリング(webスクレイピング)するにはpython,rubyどちらがいいか
    
    
    ベストアンサー
    どちらでも可能ですし結果に大した違いもないでしょう。
    
    お好きな方でどうぞ、としか...
    
[/code]

次の例はベストアンサー以外の回答がある場合です。

[code]

    $ wget -qO - https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13165913528 |
      grep -m1 -Po '^[ \t]*window.PROPS = \K.*$' |
      jq -r '
        "質問\n\(.preloadedState.question.questionText)\n",
        (
          .preloadedState.bestAnswer.answerItem.answerText as $best |
          select($best) | "ベストアンサー\n\($best)\n"
        ),
        .preloadedState.answer.answers as $ans |
          reduce range($ans|length) as $i("";.+"回答\($i+1)\n\($ans[$i].answerText)\n\n")
      '
    
    質問
    1番開発しやすいプログラム言語はなんだと思いますか？(C++は勉強していますが初心者です。)
    
    
    ベストアンサー
    言語の仕様、開発環境ソフトの優秀さ、開発効率の高さ、ユーザーの多さ、ライブラリの豊富さ、書籍の多さ、作れるアソフトの範囲、等のバランスによって、トータル的に比較されるべきかと。
                                  :
    
    回答1
    こういうのって、人によると思います。
                                  :
    
    回答2
    個人的には
                                  :
    
    回答3
    こういうのは、現時点で「開発しにくいプ
                                  :
    
    回答4
    ＞1番開発しやすいプログラム言語
                                  :
    
    回答5
    Windows環境でデスクトップアプリケーションならC#かな？
                                  :
    
[/code]

この質問では14件の回答が投稿されているのですが、最初の5件のみが表示されます。これはページングが設定されているためで、次のページを示す query
string(`page=n`) を URL に指定すれば残りの回答も取得することが可能です。

処理としては JSON テキストのパースですから Python でもできるかと思います。


CC BY-SA 4.0
2021-02-15T16:01:29.920
74024
2021-02-16T15:13:07.693
2021-02-16T15:13:07.693
74012
answer