初心者プログラマがガチムチプログラマを目指すぶろぐ

2017年の春から本格的にプログラミングを学び始めた学生です!よろしければ閲覧、ご指導のほどよろしくお願いいたします!!

Webスクレイピングやってみた

巷で噂のスクレイピング

大量の情報がストックされているインターネットとかいう場所からガバァッと情報をさらっていける技術「スクレイピング」。いろんな場所で活躍すること間違いなしなのですが、特に機械学習と仲が良さそうなので、これは勉強しない手はないと思い、使ってみました。

はまったところ

正規表現でハマっています。

for div in soup.find_all("div", class_="video-list-title"):
    print(str(div))
    s_pattern = re.compile(r'<a href=".*">')
    s_search = s_pattern.search(str(div))

    print(s_search)


出力

<div class="video-list-title"><p><a href="/recipes/5dd98b76-6358-47ce-8c1b-f59918b5a1df">意外と美味!きゅうりとベーコンのガーリック炒め</a></p></div>
<_sre.SRE_Match object; span=(33, 89), match='<a href="/recipes/5dd98b76-6358-47ce-8c1b-f59918b>

上記3行目の正規表現でurl部分をマッチさせたいのですが、最後の方が切れてしまっています。 上記3行目の正規表現部分を r’f=”.*”>’ に変えたらできたので、.* には文字制限があるのでしょうか?

→今の挙動的にはsearchには文字制限がありそう  searchの代わりにfindallを使うことでうまくいった

コード

# coding: utf-8

# In[1]:

from bs4 import BeautifulSoup
import requests
import re
import json


# In[2]:

categories_url = "https://www.kurashiru.com/categories/"
recipes_url = "https://www.kurashiru.com"


# In[3]:

c_html = requests.get(categories_url + "1")
soup = BeautifulSoup(c_html.content, "html.parser")


# In[5]:

dish_list = []
for div in soup.find_all("div", class_="video-list-title"):
    search = re.findall(r'href=".*</a>', str(div))
    url = search[0].split('"')[1]
    title = search[0].split('"')[2][1:-4]
    dish_list.append({"title": title, "url": url})
    print(dish_list)


# In[ ]:

for dish in dish_list:
    r_html = requests.get(recipe_url + dish["url"])
    soup = BeautifulSoup(r_html.content, "html.parser")
    dish["url"]

参考資料

qiita.com

orangain.hatenablog.com

qiita.com

komaken.me