

仮想環境にてPythonでのスクレイピングの勉強をしています。参考にしているのは「Pythonクローリング&スクレイピング」の106ページです。

コードをそのまま写して実行しているのですが結果が出力されません。エラーは出ずに通っているのでコードに問題は無いと思いますが、何も出力されないのはなぜでしょうか。

本来ならば以下の行に続けてURLが表示されるようです。よろしくお願いいたします。

[code]

    (scraping) vagrant@ubuntu-bionic:/vagrant$ python python_crawler_1.py　
    
[/code]

### プログラム:

[code]

    import requests
    import lxml.html
    
    response = requests.get('https://gihyo.jp/dp')
    html = lxml.html.fromstring(response.text)
    html.make_links_absolute(response.url)
    
    for a in html.cssselect('#listbook > li > a[itemprop="url"]'):
      url = a.get('href')
      print(url)
    
[/code]

### 実行時の画面:

[code]

    (scraping) vagrant@ubuntu-bionic:/vagrant$ python python_crawler_1.py
    (scraping) vagrant@ubuntu-bionic:/vagrant$
    
[/code]


CC BY-SA 4.0
2021-03-06T05:17:46.950
74447
2021-03-07T04:17:55.470
2021-03-07T04:17:55.470
19110
43905
question
python web-scraping
Pythonでスクレイピングした結果の出力がされない


CSS セレクターを打ち間違えています。正しくは `#listBook` ですが `#listbook` になっています。

### おまけ：思考の流れ

「URL が表示される」ためには、`print(url)` の行が実行される必要があります。URL
が表示されないということは、おそらくこの行が実行されていないのでしょう。

`print(url)` の行は for 文の中にあります。この行が実行されないということは、for 文の中身が 1
回も繰り返されなかったのでしょう。とりあえず `html.cssselect('#listbook > li > a[itemprop="url"]')`
が怪しいので、これを `print` してみましょう。

`print` してみると、`html.cssselect('#listbook > li > a[itemprop="url"]')` の結果が空リスト
`[]` になっていると分かります。リストの要素それぞれについて実行しようとするところで空リストを渡すと、要素がゼロ個なので 1
回も実行されないという訳です。

これで何故 URL が表示されなかったのかは分かりました。次は、なぜ空リストになるのかを考えてみましょう。

実際にブラウザで `https://gihyo.jp/dp` の HTML のソースコードを見て検索してみると、`listbook` という ID
のタグが無いことに気付きます。よく似た `listBook` という ID
のタグはあるので、おそらくこれと間違えたのだろうなと推測が付きます。後はその周辺のタグの構造が確かに `#listBook > li >
a[itemprop="url"]` で select できそうなことを確認しました。


CC BY-SA 4.0
2021-03-06T06:46:31.470
74451
2021-03-06T06:46:31.470
19110
74447
answer