@57105710hk

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Python 複数のURLから取得

解決したいこと

複数のページから同じclass属性の値を取得し、CSVに出力したいです。

発生している問題・エラー

該当するソースコード

ソースコードを入力
下記のコードでCSVまで出力できましたが、複数のURLを指定しても
1つしか取得できません。
import csv
import requests,bs4
res = requests.get('https://www.palcloset.jp/')
res.raise_for_status()
soup = bs4.BeautifulSoup(res.text,'html.parser')
elems = soup.select('.tt01')

csvlist = []
for elem in elems:
    csvlist.append(elem)

f = open('pal.csv','w',encoding='utf-8')
writecsv = csv.writer(f,lineterminator='\n')

writecsv.writerow(csvlist)

f.close



自分で試したこと

url_top ='https://www.palcloset.jp/'
url_2 = ('https://www.palcloset.jp/display/item/TYZ2002407A0006/?b=typy')

res = requests.get(url_top)
res = requests.get(url_2)

などと試しましたができませんでした。

お手数ですが、宜しくお願い致します。
0 likes

3Answer

import csv
import requests,bs4

def func(url, path):
    res = requests.get(url)
    res.raise_for_status()
    soup = bs4.BeautifulSoup(res.text,'html.parser')
    elems = soup.select('.tt01')

    csvlist = []
    for elem in elems:
        csvlist.append(elem)

    f = open(path,'w',encoding='utf-8')
    writecsv = csv.writer(f,lineterminator='\n')

    writecsv.writerow(csvlist)

    f.close


func('https://www.palcloset.jp/', 'pal.csv')
func('2つめのURL', 'pal2.csv')
0Like

Comments

  1. @57105710hk

    Questioner

    ご回答ありがとうございました!

下記のコードでCSVまで出力できましたが、複数のURLを指定しても
1つしか取得できません。

ということと、

res = requests.get(url_top)
res = requests.get(url_2)

などと試しましたができませんでした。

ということで考えると、2つ目以降のURLを読み込んだ際に res を上書きしているとか csvlist を上書きしているのかと想像しています。
ですので、 変数はどこで書き換わっているか、リストの中身には何が入っているか、などに注意して実装するのが良いかと思います。

次の実装例では質問のコードを改変し、各URLの必要なエレメントを get_elements で取得して、それを elems という一つのリストに結合するようにしています。

import csv
import requests, bs4


def get_elements(url):
    res = requests.get(url)
    res.raise_for_status()
    soup = bs4.BeautifulSoup(res.text, "html.parser")
    return soup.select(".tt01")


url_list = [
    "https://example.com/1",
    "https://example.com/2",
]

elems = []
for url in url_list:
    elems.extend(get_elements(url))

csvlist = []
for elem in elems:
    csvlist.append(elem)

f = open("pal.csv", "w", encoding="utf-8")
writecsv = csv.writer(f, lineterminator="\n")

writecsv.writerow(csvlist)

f.close()

その上で少しスッキリ書くとこの様になるでしょうか

import csv
import bs4
import requests


def get_elements(url):
    res = requests.get(url)
    res.raise_for_status()
    soup = bs4.BeautifulSoup(res.text, "html.parser")
    return soup.select(".tt01")


def main():
    url_list = [
        "https://example.com/1",
        "https://example.com/2",
    ]

    elems = []
    for url in url_list:
        elems.extend(get_elements(url))

    with open("pal.csv", "w", encoding="utf-8") as f:
        writecsv = csv.writer(f, lineterminator="\n")
        writecsv.writerow(elems)


if __name__ == "__main__":
    main()

また、先程試して見たところ、質問のコードに書かれている2つ目のURLに tt01 というクラスが無かったようです。

0Like

Comments

  1. @57105710hk

    Questioner

    分かり易い回答ありがとうございました。 こちらの指定したURLに誤りがございました。失礼しました。

Your answer might help someone💌