同じ種類のタグから異なる種類のデータを出力するースクレイピングー
wikipediaより歴代総理大臣の漢字のフルネームとその任期について別々にスクレイピングしようと考えています。
最初になんとなく書いたコード(発生している問題の上記の方のコード)に修正を加えているような状況です。
今回ご教示頂きたい点はコードの修正中に起こった問題に関してです。
修正中に起こった問題は最初に書いていたコード(発生している問題の上記のコード)ではデータが複数得られたのですが、その後書いたコード(発生している問題の下記のコード)ではデータが一つだけしか得られませんでした。
上記のコードのようにデータを複数取得したいと考えているのですが、同じようにデータを得られない理由及びどうしたら複数のデータを取得することが可能なのかご教示頂きたいです。
余談ですが、修正途中に起こった問題のため最終的な僕がしようとしているスクレイピングのゴールではありません。
発生している問題
エラーではないです。出力内容に問題があります。
上記の場合だと複数のタグの中身が返されるのですが、下記の場合のコードは返されません。最終的に取得したい内容が少し異なるのですが、遡って上記のコードと同じ部分の出力を確かめてみました。その結果、データを取得してこようとした階層が同じにも関わらず取得できるデータの量が異なっています。
このコードでは複数の結果が得られました。 import requests import matplotlib.pyplot as plt from matplotlib.offsetbox import AnchoredText from bs4 import BeautifulSoup from requests.exceptions import Timeout url = 'https://ja.wikipedia.org/wiki/%E5%86%85%E9%96%A3%E7%B7%8F%E7%90%86%E5%A4%A7%E8%87%A3#%E5%86%85%E9%96%A3%E7%B7%8F%E7%90%86%E5%A4%A7%E8%87%A3%E3%81%AE%E4%B8%80%E8%A6%A7_2' try: r = requests.get(url,timeout=3.5) except Timeout: print('this is timeout error') pass html_soup = BeautifulSoup(r.text,'html.parser') all = html_soup.find('table',class_='sortable wikitable') def person(): for per in all: for two in all.find_all('tr'): for three in two.find_all('td'): new = three.get_text(strip=True) print(new) person()
このコードはデータは一つしか出力できませんでした。(最初の一つのタグの中身のみの出力) import requests import re import matplotlib.pyplot as plt import numpy as np from matplotlib.offsetbox import AnchoredText from bs4 import BeautifulSoup from requests.exceptions import Timeout url = 'https://ja.wikipedia.org/wiki/%E5%86%85%E9%96%A3%E7%B7%8F%E7%90%86%E5%A4%A7%E8%87%A3#%E5%86%85%E9%96%A3%E7%B7%8F%E7%90%86%E5%A4%A7%E8%87%A3%E3%81%AE%E4%B8%80%E8%A6%A7_2' try: r = requests.get(url,timeout=3.5) except Timeout: print('this is timeout error') pass html_soup = BeautifulSoup(r.text,'html.parser') all = html_soup.find('table',class_='sortable wikitable') def person_name(): for per in all: for two in all.find_all('tr'): for three in two.find_all('td'): un = three.get_text(strip=True) for more in three.find_all('b'): for final in more.find_all('a'): text = more.get_text(strip=True) #上記のコードと比べるためにあえて出力する内容を戻しています。 return print(un) person_name()
試したこと
1、関係ないかとは思ったのですが一応、
returnでデータを返すと出力されるデータの量が減るのかと考え、
returnを削除したのですが結果は変わりませんでした。
2、下記のコードを遡ってprint関数でデータが複数取得できる階層を探したのですが見つかりませんでした。自分の解釈では同じ階層から情報を取ろうとしているのにも関わらずデータの量が変わっているためどこが問題点なのかも分かりません。
3、上記のコードと下記のコードではfor文の次の行のインデントが若干異なっていることに気づき修正しましたが改善がなかったためコードを元に戻しています。エラーが出ない理由は分からずじまいだったため無視しました。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/22 13:13