前提・実現したいこと
書籍名から出版社名を得て、Googleスプレッドシートにまとめたいです。Colabで作業しています。
https://teratail.com/questions/304423で同じことを国会図書館のAPIを使用して実現しようとしましたが、難儀しているためスクレイピングによる解決を目指したいと思います。
https://qiita.com/Azunyan1111/items/b161b998790b1db2ff7aを参考に、大幅に引用しています。
発生している問題・エラーメッセージ
https://honto.jp/netstore/search.html?gnrcd=1&k=%E3%82%A8%E3%83%BC%E3%82%B9%E8%96%AC%E7%90%86%E5%AD%A6&extSiteId=junkudo&cid=eu_hb_jtoh_0411&srchf=1 --------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-35-9e745ffb8004> in <module>() 35 36 # CSSセレクターを使って指定した場所のtextを表示します ---> 37 print(soup.select_one("#displayOrder1 > div > div.stInfo > div.stContents > ul > li:nth-child(4) > a").text) 38 publisher = soup.select_one("#displayOrder1 > div > div.stInfo > div.stContents > ul > li:nth-child(4) > a").text 39 #sheetに反映 AttributeError: 'NoneType' object has no attribute 'text'
該当のソースコード
Python
1import numpy as np 2from pandas import DataFrame 3import xml.etree.ElementTree as ET 4import requests 5from collections import defaultdict 6from google.colab import files 7import urllib.request 8from bs4 import BeautifulSoup 9 10ss_url = "https://docs.google.com/spreadsheets/d/ooooooo" 11workbook = gc.open_by_url(ss_url) 12worksheet = workbook.get_worksheet(1) 13 14cell_list = worksheet.range("A3:A5") 15for cell in cell_list: 16 17 # 検索条件 18 title = cell.value 19 20 # 検索用語を変換 21 search_word = urllib.parse.quote(title) 22 # アクセスするURL 23 url = "https://honto.jp/netstore/search.html?gnrcd=1&k=" + search_word + "&extSiteId=junkudo&cid=eu_hb_jtoh_0411&srchf=1" 24 print(url) 25 # URLにアクセスする 戻り値にはアクセスした結果やHTMLなどが入ったinstanceが帰ってきます 26 instance = urllib.request.urlopen(url) 27 28 # instanceからHTMLを取り出して、BeautifulSoupで扱えるようにパースします 29 soup = BeautifulSoup(instance, "html.parser") 30 31 # CSSセレクターを使って指定した場所のtextを表示します 32 print(soup.select_one("#displayOrder1 > div > div.stInfo > div.stContents > ul > li:nth-child(4) > a").text) 33 publisher = soup.select_one("#displayOrder1 > div > div.stInfo > div.stContents > ul > li:nth-child(4) > a").text 34 #sheetに反映 35 worksheet.update_cell(cell.row, cell.col +1, publisher)
試したこと
print(soup.select_one("#displayOrder1 > div > div.stInfo > div.stContents > ul > li:nth-child(4) > a").text)
を
print(soup.select_one("#displayOrder1 > div > div.stInfo > div.stContents > ul > li:nth-child(4) > a").string)
にしましたが特に変わりません。
https://qiita.com/booleanoid/items/211820516eb7a2191b32
を調べましたが、どうも別の問題かもしれません。
Seleniumを使う方法も模索中ですが、解決につながるかはわかりません。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/16 12:58
2020/11/16 13:07