

あるurlのソースコードから、下記の2箇所を取得したいのですが、  
結果のリストが空になってしまいます。

[code]

    def get_all_reviews(url):
        rvw_list_text = []
    
        res = requests.get(url)
        soup = bs4.BeautifulSoup(res.text, features='lxml')
    
        for r in soup.find_all(['dd','p']):
            if r.name == 'dd' and r.get('class') == 'rpoint-tx-point':
                rvw_list_text.append(r.get_text(strip=True))
            elif r.name == 'p' and r.get('class') == 'review-tit-article':
                rvw_list_text.append(r.get_text(strip=True))
            print(rvw_list_text)
    
    url = "https://www.xxxxx"
    rvw_list_text = get_all_reviews(url)
    
    reviews_text = []
    for i in range(len(rvw_list_text)):
        if key_word in rvw_list_text[i].text:    # 検索ワードが含まれていたら
            rvw_text = textwrap.fill(rvw_list_text[i].text, 80)
            reviews_text.append(rvw_text)
    
    
[/code]

取得したい箇所：

[code]

    <dd class="rpoint-tx-point">4.50点</dd>
    <p class="review-tx-article">
    <span class="review-tit-article">カリキュラム</span>5教科が習えるのはいいのですが、部活をやっているので、土曜日に部活の後に3時間半の授業はちょっと長くてキツイ日もあるかなと思います。</p>
    
[/code]


CC BY-SA 4.0
2019-10-25T02:29:08.943
59950
2019-10-30T04:53:25.887
2019-10-25T03:18:24.467
3060
36325
question
python beautifulsoup
複数のタグを指定してスクレイピング


可能性1: コンテンツ表示のためにページ内でjavascriptが使われている。  
可能性2: bs4で要素のclassを取得する際に、配列として渡される。

2つの可能性を考慮して、seleniumを使って書き換えました。

[code]

    from selenium.webdriver.chrome.options import Options
    from selenium import webdriver
    import bs4
    
    chrome_options = Options()
    chrome_options.add_argument("start-maximized")
    chrome_options.add_argument("disable-infobars")
    chrome_options.add_argument("--headless")
    chrome_options.add_argument("--disable-extensions")
    chrome_options.add_argument("--disable-gpu")
    chrome_options.add_argument("--disable-dev-shm-usage")
    chrome_options.add_argument("--no-sandbox")
    
    driver = webdriver.Chrome(chrome_options=chrome_options)
    
    def get_all_reviews(url):
        rvw_list_text = []
        driver.get(url)
        soup = bs4.BeautifulSoup(driver.page_source, features="html.parser")
    
        for r in soup.find_all(['dd', 'p']):
            try:
                n_cls = r["class"]
                print(n_cls)
            except KeyError:
                continue
            if 'rpoint-tx-point' in n_cls:
                rvw_list_text.append(r.get_text(strip=True))
            elif 'review-tx-article' in n_cls:
                rvw_list_text.append(r.get_text(strip=True))
    
        return rvw_list_text
    
    
    url = "http://xxx"
    rvw_list_text = get_all_reviews(url)
    
    print(rvw_list_text)
    
[/code]

seleniumでchrome使うためには、chromeをインストールした上で、chromeバージョンに対応したchromedriverをPATHに通す必要があります。  
<https://sites.google.com/a/chromium.org/chromedriver/home>


CC BY-SA 4.0
2019-10-30T04:53:25.887
60111
2019-10-30T04:53:25.887
59950
answer