{"id":43448,"date":"2025-07-31T14:49:52","date_gmt":"2025-07-31T05:49:52","guid":{"rendered":"https:\/\/techgym.jp\/?p=43448"},"modified":"2025-07-31T14:49:56","modified_gmt":"2025-07-31T05:49:56","slug":"python-beautifulsoup","status":"publish","type":"post","link":"https:\/\/techgym.jp\/column\/python-beautifulsoup\/","title":{"rendered":"Python BeautifulSoup\u306e\u4f7f\u3044\u65b9\u5b8c\u5168\u30ac\u30a4\u30c9\uff01Web\u30b9\u30af\u30ec\u30a4\u30d4\u30f3\u30b0\u5165\u9580\u30102025\u5e74\u6700\u65b0\u7248\u3011"},"content":{"rendered":"\n<p>\u00a0<\/p>\n<p>Web\u30b9\u30af\u30ec\u30a4\u30d4\u30f3\u30b0\u3067HTML\u3092\u89e3\u6790\u3057\u305f\u3044\u3051\u3069\u3001\u3069\u306e\u30e9\u30a4\u30d6\u30e9\u30ea\u3092\u4f7f\u3048\u3070\u3044\u3044\u304b\u8ff7\u3063\u3066\u3044\u307e\u305b\u3093\u304b\uff1fPython BeautifulSoup\u306f\u3001HTML\u3084XML\u306e\u89e3\u6790\u306b\u304a\u3044\u3066\u6700\u3082\u4eba\u6c17\u304c\u9ad8\u304f\u3001\u521d\u5fc3\u8005\u306b\u3082\u4f7f\u3044\u3084\u3059\u3044\u30e9\u30a4\u30d6\u30e9\u30ea\u3067\u3059\u3002\u3053\u306e\u8a18\u4e8b\u3067\u306f\u3001BeautifulSoup\u306e\u57fa\u672c\u7684\u306a\u4f7f\u3044\u65b9\u304b\u3089\u5b9f\u8df5\u7684\u306aWeb\u30b9\u30af\u30ec\u30a4\u30d4\u30f3\u30b0\u624b\u6cd5\u307e\u3067\u3001\u5206\u304b\u308a\u3084\u3059\u304f\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n<h2>Python BeautifulSoup\u3068\u306f\uff1f\u3067\u304d\u308b\u3053\u3068\u3092\u89e3\u8aac<\/h2>\n<p>BeautifulSoup\u306f\u3001HTML\u3084XML\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u3092\u89e3\u6790\u3059\u308b\u305f\u3081\u306ePython\u30e9\u30a4\u30d6\u30e9\u30ea\u3067\u3059\u3002Web\u30da\u30fc\u30b8\u304b\u3089\u7279\u5b9a\u306e\u60c5\u5831\u3092\u62bd\u51fa\u3057\u305f\u308a\u3001\u30c7\u30fc\u30bf\u3092\u69cb\u9020\u5316\u3057\u305f\u308a\u3059\u308b\u969b\u306b\u5a01\u529b\u3092\u767a\u63ee\u3057\u307e\u3059\u3002<\/p>\n<h3>BeautifulSoup\u3067\u3067\u304d\u308b\u3053\u3068<\/h3>\n<ul>\n<li><strong>Web\u30b9\u30af\u30ec\u30a4\u30d4\u30f3\u30b0<\/strong>: \u30cb\u30e5\u30fc\u30b9\u30b5\u30a4\u30c8\u3084\u5546\u54c1\u60c5\u5831\u306e\u81ea\u52d5\u53ce\u96c6<\/li>\n<li><strong>HTML\u89e3\u6790<\/strong>: Web\u30da\u30fc\u30b8\u306e\u69cb\u9020\u5206\u6790<\/li>\n<li><strong>\u30c7\u30fc\u30bf\u62bd\u51fa<\/strong>: \u7279\u5b9a\u306e\u30bf\u30b0\u3084\u30af\u30e9\u30b9\u304b\u3089\u60c5\u5831\u3092\u53d6\u5f97<\/li>\n<li><strong>XML\u51e6\u7406<\/strong>: RSS feed\u3084API \u30ec\u30b9\u30dd\u30f3\u30b9\u306e\u89e3\u6790<\/li>\n<\/ul>\n<h2>Python BeautifulSoup\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u65b9\u6cd5<\/h2>\n<p>BeautifulSoup\u3068HTTP\u30ea\u30af\u30a8\u30b9\u30c8\u306b\u5fc5\u8981\u306arequests\u30e9\u30a4\u30d6\u30e9\u30ea\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u307e\u3059\u3002<\/p>\n<pre><code class=\"language-bash\">pip install beautifulsoup4 requests lxml\n<\/code><\/pre>\n<p>lxml\u306f\u9ad8\u901f\u306aXML\u30d1\u30fc\u30b5\u30fc\u3068\u3057\u3066\u63a8\u5968\u3055\u308c\u3066\u3044\u307e\u3059\u3002<\/p>\n<h2>\u3010\u57fa\u672c\u7de8\u3011BeautifulSoup\u306e\u4f7f\u3044\u65b9<\/h2>\n<h3>1. \u57fa\u672c\u7684\u306aHTML\u89e3\u6790<\/h3>\n<pre><code class=\"language-python\">from bs4 import BeautifulSoup\nimport requests\n\n# Web\u30da\u30fc\u30b8\u3092\u53d6\u5f97\nurl = \"https:\/\/httpbin.org\/html\"\nresponse = requests.get(url)\nsoup = BeautifulSoup(response.content, 'html.parser')\n\n# \u30bf\u30a4\u30c8\u30eb\u3092\u53d6\u5f97\nprint(soup.title.text)  # \u30da\u30fc\u30b8\u30bf\u30a4\u30c8\u30eb\nprint(soup.find('h1').text)  # \u6700\u521d\u306eh1\u30bf\u30b0\n<\/code><\/pre>\n<h3>2. \u8981\u7d20\u306e\u691c\u7d22\u65b9\u6cd5<\/h3>\n<pre><code class=\"language-python\">from bs4 import BeautifulSoup\n\nhtml = \"\"\"\n&lt;html&gt;\n&lt;body&gt;\n&lt;div class=\"content\"&gt;\n&lt;p id=\"first\"&gt;\u6700\u521d\u306e\u6bb5\u843d&lt;\/p&gt;\n&lt;p class=\"highlight\"&gt;\u30cf\u30a4\u30e9\u30a4\u30c8\u6bb5\u843d&lt;\/p&gt;\n&lt;a href=\"https:\/\/example.com\"&gt;\u30ea\u30f3\u30af&lt;\/a&gt;\n&lt;\/div&gt;\n&lt;\/body&gt;\n&lt;\/html&gt;\n\"\"\"\n\nsoup = BeautifulSoup(html, 'html.parser')\n\n# ID\u3067\u691c\u7d22\nfirst_p = soup.find('p', id='first')\nprint(first_p.text)\n\n# \u30af\u30e9\u30b9\u3067\u691c\u7d22\nhighlight = soup.find('p', class_='highlight')\nprint(highlight.text)\n\n# \u8907\u6570\u8981\u7d20\u3092\u53d6\u5f97\nall_p = soup.find_all('p')\nfor p in all_p:\n    print(p.text)\n<\/code><\/pre>\n<h3>3. CSS\u30bb\u30ec\u30af\u30bf\u30fc\u306e\u4f7f\u7528<\/h3>\n<pre><code class=\"language-python\">from bs4 import BeautifulSoup\n\nhtml = \"\"\"\n&lt;div class=\"container\"&gt;\n&lt;div class=\"item\"&gt;\u30a2\u30a4\u30c6\u30e01&lt;\/div&gt;\n&lt;div class=\"item special\"&gt;\u30a2\u30a4\u30c6\u30e02&lt;\/div&gt;\n&lt;ul&gt;\n&lt;li&gt;\u30ea\u30b9\u30c81&lt;\/li&gt;\n&lt;li&gt;\u30ea\u30b9\u30c82&lt;\/li&gt;\n&lt;\/ul&gt;\n&lt;\/div&gt;\n\"\"\"\n\nsoup = BeautifulSoup(html, 'html.parser')\n\n# CSS\u30bb\u30ec\u30af\u30bf\u30fc\u3067\u691c\u7d22\nitems = soup.select('.item')  # \u30af\u30e9\u30b9\u540d\u3067\u691c\u7d22\nspecial = soup.select('.item.special')  # \u8907\u6570\u30af\u30e9\u30b9\nfirst_li = soup.select('ul li:first-child')  # \u64ec\u4f3c\u30bb\u30ec\u30af\u30bf\u30fc\n\nfor item in items:\n    print(item.text)\n<\/code><\/pre>\n<h2>\u3010\u5b9f\u8df5\u7de8\u3011BeautifulSoup\u3092\u4f7f\u3063\u305fWeb\u30b9\u30af\u30ec\u30a4\u30d4\u30f3\u30b0<\/h2>\n<h3>\u30cb\u30e5\u30fc\u30b9\u30b5\u30a4\u30c8\u306e\u898b\u51fa\u3057\u53d6\u5f97<\/h3>\n<pre><code class=\"language-python\">from bs4 import BeautifulSoup\nimport requests\n\ndef get_news_headlines(url):\n    response = requests.get(url)\n    soup = BeautifulSoup(response.content, 'html.parser')\n    \n    # \u898b\u51fa\u3057\u3092\u53d6\u5f97\uff08\u30b5\u30a4\u30c8\u306b\u5fdc\u3058\u3066\u8abf\u6574\uff09\n    headlines = soup.find_all('h2', class_='headline')\n    \n    for i, headline in enumerate(headlines[:5], 1):\n        print(f\"{i}. {headline.text.strip()}\")\n\n# \u4f7f\u7528\u4f8b\nget_news_headlines(\"https:\/\/example-news.com\")\n<\/code><\/pre>\n<h3>\u5546\u54c1\u4fa1\u683c\u306e\u76e3\u8996\u30b7\u30b9\u30c6\u30e0<\/h3>\n<pre><code class=\"language-python\">from bs4 import BeautifulSoup\nimport requests\n\ndef get_product_price(url, price_selector):\n    headers = {'User-Agent': 'Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36'}\n    response = requests.get(url, headers=headers)\n    soup = BeautifulSoup(response.content, 'html.parser')\n    \n    price_element = soup.select_one(price_selector)\n    if price_element:\n        price = price_element.text.strip()\n        return price\n    return None\n\n# Amazon\u5546\u54c1\u4fa1\u683c\u53d6\u5f97\u4f8b\uff08\u30bb\u30ec\u30af\u30bf\u30fc\u306f\u5b9f\u969b\u306e\u30b5\u30a4\u30c8\u306b\u5408\u308f\u305b\u3066\u8abf\u6574\uff09\nprice = get_product_price(\"https:\/\/amazon.com\/product\/123\", \".a-price-whole\")\nprint(f\"\u73fe\u5728\u4fa1\u683c: {price}\")\n<\/code><\/pre>\n<h3>\u30c6\u30fc\u30d6\u30eb\u30c7\u30fc\u30bf\u306e\u62bd\u51fa<\/h3>\n<pre><code class=\"language-python\">from bs4 import BeautifulSoup\nimport requests\nimport pandas as pd\n\ndef scrape_table_data(url, table_selector):\n    response = requests.get(url)\n    soup = BeautifulSoup(response.content, 'html.parser')\n    \n    table = soup.select_one(table_selector)\n    rows = table.find_all('tr')\n    \n    data = []\n    for row in rows[1:]:  # \u30d8\u30c3\u30c0\u30fc\u884c\u3092\u30b9\u30ad\u30c3\u30d7\n        cols = row.find_all(['td', 'th'])\n        data.append([col.text.strip() for col in cols])\n    \n    return data\n\n# \u4f7f\u7528\u4f8b\ntable_data = scrape_table_data(\"https:\/\/example.com\/table\", \"table.data-table\")\ndf = pd.DataFrame(table_data)\nprint(df.head())\n<\/code><\/pre>\n<h2>BeautifulSoup\u306e\u8981\u7d20\u691c\u7d22\u30e1\u30bd\u30c3\u30c9\u4e00\u89a7<\/h2>\n<table>\n<thead>\n<tr>\n<th>\u30e1\u30bd\u30c3\u30c9<\/th>\n<th>\u4f7f\u3044\u65b9<\/th>\n<th>\u623b\u308a\u5024<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>find()<\/code><\/td>\n<td><code>soup.find('tag', attrs={})<\/code><\/td>\n<td>\u6700\u521d\u306e1\u3064\u306e\u8981\u7d20<\/td>\n<\/tr>\n<tr>\n<td><code>find_all()<\/code><\/td>\n<td><code>soup.find_all('tag')<\/code><\/td>\n<td>\u8a72\u5f53\u3059\u308b\u5168\u3066\u306e\u8981\u7d20\u306e\u30ea\u30b9\u30c8<\/td>\n<\/tr>\n<tr>\n<td><code>select()<\/code><\/td>\n<td><code>soup.select('css-selector')<\/code><\/td>\n<td>CSS\u30bb\u30ec\u30af\u30bf\u30fc\u3067\u5168\u8981\u7d20<\/td>\n<\/tr>\n<tr>\n<td><code>select_one()<\/code><\/td>\n<td><code>soup.select_one('css-selector')<\/code><\/td>\n<td>CSS\u30bb\u30ec\u30af\u30bf\u30fc\u3067\u6700\u521d\u306e1\u3064<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>\u5c5e\u6027\u306b\u3088\u308b\u691c\u7d22<\/h3>\n<pre><code class=\"language-python\">from bs4 import BeautifulSoup\n\nhtml = '&lt;a href=\"https:\/\/example.com\" target=\"_blank\"&gt;\u30ea\u30f3\u30af&lt;\/a&gt;'\nsoup = BeautifulSoup(html, 'html.parser')\n\n# \u5c5e\u6027\u3067\u691c\u7d22\nlink = soup.find('a', href=\"https:\/\/example.com\")\nexternal_links = soup.find_all('a', target=\"_blank\")\n\n# \u5c5e\u6027\u5024\u3092\u53d6\u5f97\nprint(link['href'])  # https:\/\/example.com\nprint(link.get('target'))  # _blank\n<\/code><\/pre>\n<h2>BeautifulSoup\u3067\u4f7f\u3048\u308b\u4fbf\u5229\u306a\u30c6\u30af\u30cb\u30c3\u30af<\/h2>\n<h3>1. \u89aa\u8981\u7d20\u30fb\u5144\u5f1f\u8981\u7d20\u306e\u53d6\u5f97<\/h3>\n<pre><code class=\"language-python\">from bs4 import BeautifulSoup\n\nhtml = \"\"\"\n&lt;div class=\"parent\"&gt;\n&lt;p&gt;\u524d\u306e\u6bb5\u843d&lt;\/p&gt;\n&lt;p class=\"target\"&gt;\u5bfe\u8c61\u6bb5\u843d&lt;\/p&gt;\n&lt;p&gt;\u6b21\u306e\u6bb5\u843d&lt;\/p&gt;\n&lt;\/div&gt;\n\"\"\"\n\nsoup = BeautifulSoup(html, 'html.parser')\ntarget = soup.find('p', class_='target')\n\nprint(target.parent.name)  # div\uff08\u89aa\u8981\u7d20\uff09\nprint(target.previous_sibling.previous_sibling.text)  # \u524d\u306e\u6bb5\u843d\nprint(target.next_sibling.next_sibling.text)  # \u6b21\u306e\u6bb5\u843d\n<\/code><\/pre>\n<h3>2. \u30c6\u30ad\u30b9\u30c8\u306e\u6e05\u6d44\u5316<\/h3>\n<pre><code class=\"language-python\">from bs4 import BeautifulSoup\nimport re\n\nhtml = '&lt;p&gt;   \u4e0d\u8981\u306a\u7a7a\u767d   \\n\\t\u6539\u884c\u6587\u5b57\\n   &lt;\/p&gt;'\nsoup = BeautifulSoup(html, 'html.parser')\n\n# \u57fa\u672c\u7684\u306a\u30c6\u30ad\u30b9\u30c8\u53d6\u5f97\ntext = soup.p.text\nclean_text = re.sub(r'\\s+', ' ', text.strip())\nprint(clean_text)  # \u4e0d\u8981\u306a\u7a7a\u767d \u6539\u884c\u6587\u5b57\n\n# get_text()\u30e1\u30bd\u30c3\u30c9\u3067\u3088\u308a\u8a73\u7d30\u306a\u5236\u5fa1\nclean_text = soup.p.get_text(strip=True, separator=' ')\nprint(clean_text)\n<\/code><\/pre>\n<h3>3. \u8907\u6570\u6761\u4ef6\u3067\u306e\u691c\u7d22<\/h3>\n<pre><code class=\"language-python\">from bs4 import BeautifulSoup\n\nhtml = \"\"\"\n&lt;div class=\"item active\"&gt;\u30a2\u30af\u30c6\u30a3\u30d6\u30a2\u30a4\u30c6\u30e0&lt;\/div&gt;\n&lt;div class=\"item\"&gt;\u901a\u5e38\u30a2\u30a4\u30c6\u30e0&lt;\/div&gt;\n&lt;div class=\"item featured\"&gt;\u7279\u96c6\u30a2\u30a4\u30c6\u30e0&lt;\/div&gt;\n\"\"\"\n\nsoup = BeautifulSoup(html, 'html.parser')\n\n# \u8907\u6570\u30af\u30e9\u30b9\u3092\u6301\u3064\u8981\u7d20\nactive_item = soup.find('div', class_=['item', 'active'])\n\n# \u30ab\u30b9\u30bf\u30e0\u95a2\u6570\u3067\u306e\u691c\u7d22\ndef has_multiple_classes(tag):\n    return tag.has_attr('class') and len(tag['class']) &gt; 1\n\nmulti_class_items = soup.find_all(has_multiple_classes)\nfor item in multi_class_items:\n    print(item.text)\n<\/code><\/pre>\n<h2>BeautifulSoup\u3067\u3088\u304f\u3042\u308b\u30a8\u30e9\u30fc\u3068\u5bfe\u51e6\u6cd5<\/h2>\n<h3>1. AttributeError: &#8216;NoneType&#8217; object has no attribute<\/h3>\n<p><strong>\u539f\u56e0<\/strong>: \u8981\u7d20\u304c\u898b\u3064\u304b\u3089\u306a\u3044\u5834\u5408\u306bNone\u304c\u8fd4\u3055\u308c\u308b<\/p>\n<pre><code class=\"language-python\">from bs4 import BeautifulSoup\n\nsoup = BeautifulSoup('&lt;div&gt;&lt;\/div&gt;', 'html.parser')\n\n# \u5371\u967a\u306a\u30b3\u30fc\u30c9\n# print(soup.find('p').text)  # AttributeError\n\n# \u5b89\u5168\u306a\u30b3\u30fc\u30c9\np_tag = soup.find('p')\nif p_tag:\n    print(p_tag.text)\nelse:\n    print(\"\u8981\u7d20\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\")\n<\/code><\/pre>\n<h3>2. \u30a8\u30f3\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0\u30a8\u30e9\u30fc<\/h3>\n<pre><code class=\"language-python\">import requests\nfrom bs4 import BeautifulSoup\n\nresponse = requests.get(url)\nresponse.encoding = 'utf-8'  # \u30a8\u30f3\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0\u3092\u660e\u793a\u7684\u306b\u6307\u5b9a\nsoup = BeautifulSoup(response.content, 'html.parser')\n<\/code><\/pre>\n<h3>3. \u30d1\u30fc\u30b5\u30fc\u306e\u9078\u629e<\/h3>\n<pre><code class=\"language-python\">from bs4 import BeautifulSoup\n\n# \u63a8\u5968: lxml\uff08\u9ad8\u901f\u30fb\u6b63\u78ba\uff09\nsoup = BeautifulSoup(html, 'lxml')\n\n# \u30d5\u30a9\u30fc\u30eb\u30d0\u30c3\u30af: html.parser\uff08\u6a19\u6e96\u30e9\u30a4\u30d6\u30e9\u30ea\uff09\nsoup = BeautifulSoup(html, 'html.parser')\n<\/code><\/pre>\n<h2>BeautifulSoup\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316<\/h2>\n<h3>1. \u9069\u5207\u306a\u30d1\u30fc\u30b5\u30fc\u306e\u9078\u629e<\/h3>\n<pre><code class=\"language-python\">import time\nfrom bs4 import BeautifulSoup\n\n# \u5927\u304d\u306aHTML\u30d5\u30a1\u30a4\u30eb\u306e\u5834\u5408\nlarge_html = open('large_file.html').read()\n\n# lxml\u304c\u6700\u3082\u9ad8\u901f\nstart = time.time()\nsoup = BeautifulSoup(large_html, 'lxml')\nprint(f\"lxml: {time.time() - start:.3f}\u79d2\")\n<\/code><\/pre>\n<h3>2. \u5fc5\u8981\u306a\u90e8\u5206\u3060\u3051\u3092\u89e3\u6790<\/h3>\n<pre><code class=\"language-python\">from bs4 import BeautifulSoup, SoupStrainer\n\n# \u7279\u5b9a\u306e\u30bf\u30b0\u306e\u307f\u3092\u89e3\u6790\nonly_links = SoupStrainer('a')\nsoup = BeautifulSoup(html, 'lxml', parse_only=only_links)\n\n# \u30af\u30e9\u30b9\u540d\u3067\u9650\u5b9a\nonly_content = SoupStrainer('div', class_='content')\nsoup = BeautifulSoup(html, 'lxml', parse_only=only_content)\n<\/code><\/pre>\n<h2>BeautifulSoup\u3068\u4ed6\u306e\u30e9\u30a4\u30d6\u30e9\u30ea\u3068\u306e\u9023\u643a<\/h2>\n<h3>requests\u3068\u306e\u7d44\u307f\u5408\u308f\u305b<\/h3>\n<pre><code class=\"language-python\">import requests\nfrom bs4 import BeautifulSoup\nimport time\n\ndef safe_request(url, max_retries=3):\n    for i in range(max_retries):\n        try:\n            response = requests.get(url, timeout=10)\n            response.raise_for_status()\n            return response\n        except requests.RequestException as e:\n            if i == max_retries - 1:\n                raise e\n            time.sleep(2 ** i)  # \u30a8\u30af\u30b9\u30dd\u30cd\u30f3\u30b7\u30e3\u30eb\u30d0\u30c3\u30af\u30aa\u30d5\n\nresponse = safe_request(\"https:\/\/example.com\")\nsoup = BeautifulSoup(response.content, 'html.parser')\n<\/code><\/pre>\n<h3>pandas\u3068\u306e\u9023\u643a<\/h3>\n<pre><code class=\"language-python\">from bs4 import BeautifulSoup\nimport pandas as pd\nimport requests\n\ndef scrape_to_dataframe(url, table_selector):\n    response = requests.get(url)\n    soup = BeautifulSoup(response.content, 'html.parser')\n    \n    tables = pd.read_html(str(soup.select_one(table_selector)))\n    return tables[0] if tables else None\n\n# HTML\u30c6\u30fc\u30d6\u30eb\u3092\u76f4\u63a5DataFrame\u306b\u5909\u63db\ndf = scrape_to_dataframe(\"https:\/\/example.com\", \"table.data\")\nprint(df.head())\n<\/code><\/pre>\n<h2>\u5b9f\u7528\u7684\u306aBeautifulSoup\u30b9\u30af\u30ec\u30a4\u30d4\u30f3\u30b0\u4e8b\u4f8b<\/h2>\n<h3>1. RSS feed\u306e\u89e3\u6790<\/h3>\n<pre><code class=\"language-python\">from bs4 import BeautifulSoup\nimport requests\n\ndef parse_rss_feed(rss_url):\n    response = requests.get(rss_url)\n    soup = BeautifulSoup(response.content, 'xml')\n    \n    items = soup.find_all('item')\n    articles = []\n    \n    for item in items[:5]:\n        article = {\n            'title': item.title.text,\n            'link': item.link.text,\n            'description': BeautifulSoup(item.description.text, 'html.parser').text\n        }\n        articles.append(article)\n    \n    return articles\n\n# \u4f7f\u7528\u4f8b\narticles = parse_rss_feed(\"https:\/\/example.com\/rss\")\nfor article in articles:\n    print(f\"\u30bf\u30a4\u30c8\u30eb: {article['title']}\")\n<\/code><\/pre>\n<h3>2. \u753b\u50cfURL\u306e\u4e00\u62ec\u53d6\u5f97<\/h3>\n<pre><code class=\"language-python\">from bs4 import BeautifulSoup\nimport requests\nfrom urllib.parse import urljoin\n\ndef get_all_images(url):\n    response = requests.get(url)\n    soup = BeautifulSoup(response.content, 'html.parser')\n    \n    images = soup.find_all('img')\n    image_urls = []\n    \n    for img in images:\n        src = img.get('src')\n        if src:\n            # \u76f8\u5bfeURL\u3092\u7d76\u5bfeURL\u306b\u5909\u63db\n            absolute_url = urljoin(url, src)\n            image_urls.append(absolute_url)\n    \n    return image_urls\n\n# \u4f7f\u7528\u4f8b\nimages = get_all_images(\"https:\/\/example.com\")\nfor img_url in images[:3]:\n    print(img_url)\n<\/code><\/pre>\n<h3>3. SNS\u306e\u6295\u7a3f\u30c7\u30fc\u30bf\u53ce\u96c6<\/h3>\n<pre><code class=\"language-python\">from bs4 import BeautifulSoup\nimport requests\nimport json\n\ndef scrape_social_posts(url, post_selector):\n    headers = {\n        'User-Agent': 'Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36'\n    }\n    \n    response = requests.get(url, headers=headers)\n    soup = BeautifulSoup(response.content, 'html.parser')\n    \n    posts = soup.select(post_selector)\n    post_data = []\n    \n    for post in posts[:10]:\n        data = {\n            'text': post.get_text(strip=True),\n            'timestamp': post.find('time')['datetime'] if post.find('time') else None,\n            'likes': extract_number(post.select_one('.like-count'))\n        }\n        post_data.append(data)\n    \n    return post_data\n\ndef extract_number(element):\n    if element:\n        return int(''.join(filter(str.isdigit, element.text)))\n    return 0\n<\/code><\/pre>\n<h2>BeautifulSoup\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h2>\n<h3>1. \u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u306e\u5b9f\u88c5<\/h3>\n<pre><code class=\"language-python\">from bs4 import BeautifulSoup\nimport requests\nimport logging\n\ndef robust_scraping(url, selector):\n    try:\n        response = requests.get(url, timeout=10)\n        response.raise_for_status()\n        \n        soup = BeautifulSoup(response.content, 'html.parser')\n        elements = soup.select(selector)\n        \n        if not elements:\n            logging.warning(f\"\u8981\u7d20\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093: {selector}\")\n            return []\n        \n        return [elem.text.strip() for elem in elements]\n        \n    except requests.RequestException as e:\n        logging.error(f\"\u30ea\u30af\u30a8\u30b9\u30c8\u30a8\u30e9\u30fc: {e}\")\n        return []\n    except Exception as e:\n        logging.error(f\"\u4e88\u671f\u3057\u306a\u3044\u30a8\u30e9\u30fc: {e}\")\n        return []\n<\/code><\/pre>\n<h3>2. \u30ec\u30fc\u30c8\u5236\u9650\u306e\u5b9f\u88c5<\/h3>\n<pre><code class=\"language-python\">import time\nfrom bs4 import BeautifulSoup\nimport requests\n\nclass RateLimitedScraper:\n    def __init__(self, delay=1):\n        self.delay = delay\n        self.last_request = 0\n    \n    def scrape(self, url, selector):\n        # \u30ec\u30fc\u30c8\u5236\u9650\n        elapsed = time.time() - self.last_request\n        if elapsed &lt; self.delay:\n            time.sleep(self.delay - elapsed)\n        \n        response = requests.get(url)\n        self.last_request = time.time()\n        \n        soup = BeautifulSoup(response.content, 'html.parser')\n        return soup.select(selector)\n\n# \u4f7f\u7528\u4f8b\nscraper = RateLimitedScraper(delay=2)  # 2\u79d2\u9593\u9694\nresults = scraper.scrape(\"https:\/\/example.com\", \".item\")\n<\/code><\/pre>\n<h2>\u307e\u3068\u3081\uff1aBeautifulSoup\u3067Web\u30b9\u30af\u30ec\u30a4\u30d4\u30f3\u30b0\u3092\u30de\u30b9\u30bf\u30fc\u3057\u3088\u3046<\/h2>\n<p>Python BeautifulSoup\u306f\u3001Web\u30b9\u30af\u30ec\u30a4\u30d4\u30f3\u30b0\u306b\u304a\u3044\u3066\u5fc5\u9808\u306e\u30e9\u30a4\u30d6\u30e9\u30ea\u3067\u3059\u3002\u3053\u306e\u8a18\u4e8b\u3067\u7d39\u4ecb\u3057\u305f\u57fa\u672c\u7684\u306a\u4f7f\u3044\u65b9\u304b\u3089\u5b9f\u8df5\u7684\u306a\u30c6\u30af\u30cb\u30c3\u30af\u307e\u3067\u3092\u6d3b\u7528\u3059\u308c\u3070\u3001\u52b9\u7387\u7684\u306bWeb\u30c7\u30fc\u30bf\u3092\u53ce\u96c6\u30fb\u5206\u6790\u3067\u304d\u308b\u3088\u3046\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n<p><strong>\u91cd\u8981\u306a\u30dd\u30a4\u30f3\u30c8<\/strong>\uff1a<\/p>\n<ul>\n<li>\u9069\u5207\u306a\u30d1\u30fc\u30b5\u30fc\uff08lxml\u63a8\u5968\uff09\u3092\u9078\u629e\u3059\u308b<\/li>\n<li>\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u3092\u5fc5\u305a\u5b9f\u88c5\u3059\u308b<\/li>\n<li>\u30ec\u30fc\u30c8\u5236\u9650\u3067\u30b5\u30fc\u30d0\u30fc\u306b\u914d\u616e\u3059\u308b<\/li>\n<li>robots.txt\u3068\u30b5\u30a4\u30c8\u5229\u7528\u898f\u7d04\u3092\u78ba\u8a8d\u3059\u308b<\/li>\n<\/ul>\n<p>\u307e\u305a\u306f\u7c21\u5358\u306aHTML\u306e\u89e3\u6790\u304b\u3089\u59cb\u3081\u3066\u3001\u5f90\u3005\u306b\u8907\u96d1\u306aWeb\u30b9\u30af\u30ec\u30a4\u30d4\u30f3\u30b0\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306b\u6311\u6226\u3057\u3066\u307f\u3066\u304f\u3060\u3055\u3044\u3002BeautifulSoup\u3092\u30de\u30b9\u30bf\u30fc\u3059\u308c\u3070\u3001Web\u4e0a\u306e\u81a8\u5927\u306a\u60c5\u5831\u3092\u81ea\u52d5\u7684\u306b\u53ce\u96c6\u30fb\u6d3b\u7528\u3067\u304d\u308b\u3088\u3046\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n<hr \/>\n<p><em>\u3053\u306e\u8a18\u4e8b\u304c\u304a\u5f79\u306b\u7acb\u3061\u307e\u3057\u305f\u3089\u3001\u305c\u3072\u30b7\u30a7\u30a2\u3057\u3066\u304f\u3060\u3055\u3044\u3002BeautifulSoup\u3084Web\u30b9\u30af\u30ec\u30a4\u30d4\u30f3\u30b0\u306b\u95a2\u3059\u308b\u3054\u8cea\u554f\u304c\u3054\u3056\u3044\u307e\u3057\u305f\u3089\u3001\u304a\u6c17\u8efd\u306b\u30b3\u30e1\u30f3\u30c8\u3067\u304a\u77e5\u3089\u305b\u304f\u3060\u3055\u3044\u3002<\/em><\/p>\n\n\n\n<p>\u25a0\u30d7\u30ed\u30f3\u30d7\u30c8\u3060\u3051\u3067\u30aa\u30ea\u30b8\u30ca\u30eb\u30a2\u30d7\u30ea\u3092\u958b\u767a\u30fb\u516c\u958b\u3057\u3066\u307f\u305f\uff01\uff01<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-wp-embed\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"VbB4PupR6k\"><a href=\"https:\/\/techgym.jp\/column\/ori-app\/\">\u30d7\u30ed\u30f3\u30d7\u30c8\u3060\u3051\u3067\u30aa\u30ea\u30b8\u30ca\u30eb\u30a2\u30d7\u30ea\u3092\u958b\u767a\u30fb\u516c\u958b\u3057\u3066\u307f\u305f\uff01\uff01<\/a><\/blockquote><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; visibility: hidden;\" title=\"&#8220;\u30d7\u30ed\u30f3\u30d7\u30c8\u3060\u3051\u3067\u30aa\u30ea\u30b8\u30ca\u30eb\u30a2\u30d7\u30ea\u3092\u958b\u767a\u30fb\u516c\u958b\u3057\u3066\u307f\u305f\uff01\uff01&#8221; &#8212; \u3010\u30c6\u30c3\u30af\u30b8\u30e0\u3011\u683c\u5b89\u30fb\u5bfe\u9762\u578b\u30d7\u30ed\u30b0\u30e9\u30df\u30f3\u30b0\u30b9\u30af\u30fc\u30eb\" src=\"https:\/\/techgym.jp\/column\/ori-app\/embed\/#?secret=hD7RebRTiL#?secret=VbB4PupR6k\" data-secret=\"VbB4PupR6k\" width=\"600\" height=\"338\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><\/figure>\n\n\n\n<p>\u25a0AI\u6642\u4ee3\u306e\u7b2c\u4e00\u6b69\uff01\u300cAI\u99c6\u52d5\u958b\u767a\u30b3\u30fc\u30b9\u300d\u306f\u3058\u3081\u307e\u3057\u305f\uff01<\/p>\n\n\n\n<p>\u30c6\u30c3\u30af\u30b8\u30e0\u6771\u4eac\u672c\u6821\u3067\u5148\u884c\u958b\u59cb\u3002<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-wp-embed\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"5e0XpVhlOk\"><a href=\"https:\/\/techgym.jp\/about\/ai-driven-development\/\">AI\u99c6\u52d5\u958b\u767a\/\u751f\u6210AI\u30a8\u30f3\u30b8\u30cb\u30a2\u30b3\u30fc\u30b9\uff08\u521d\u5fc3\u8005\u5411\u3051\uff09<\/a><\/blockquote><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; visibility: hidden;\" title=\"&#8220;AI\u99c6\u52d5\u958b\u767a\/\u751f\u6210AI\u30a8\u30f3\u30b8\u30cb\u30a2\u30b3\u30fc\u30b9\uff08\u521d\u5fc3\u8005\u5411\u3051\uff09&#8221; &#8212; \u3010\u30c6\u30c3\u30af\u30b8\u30e0\u3011\u683c\u5b89\u30fb\u5bfe\u9762\u578b\u30d7\u30ed\u30b0\u30e9\u30df\u30f3\u30b0\u30b9\u30af\u30fc\u30eb\" src=\"https:\/\/techgym.jp\/about\/ai-driven-development\/embed\/#?secret=XCqdwmOvmg#?secret=5e0XpVhlOk\" data-secret=\"5e0XpVhlOk\" width=\"600\" height=\"338\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><\/figure>\n\n\n\n<p>\u25a0\u30c6\u30c3\u30af\u30b8\u30e0\u6771\u4eac\u672c\u6821<\/p>\n\n\n\n<p>\u300c\u6b66\u7530\u587e\u300d\u306e\u30d7\u30ed\u30b0\u30e9\u30df\u30f3\u30b0\u7248\u3068\u3044\u3048\u3070\u300c\u30c6\u30c3\u30af\u30b8\u30e0\u300d\u3002<br>\u8b1b\u7fa9\u52d5\u753b\u306a\u3057\u3001\u6559\u79d1\u66f8\u306a\u3057\u3002\u300c\u9032\u6357\u7ba1\u7406\u3068\u30b3\u30fc\u30c1\u30f3\u30b0\u300d\u3067\u52b9\u7387\u5b66\u7fd2\u3002<br>\u3088\u308a\u65e9\u304f\u3001\u3088\u308a\u5b89\u304f\u3001\u3057\u304b\u3082\u5bfe\u9762\u578b\u306e\u30d7\u30ed\u30b0\u30e9\u30df\u30f3\u30b0\u30b9\u30af\u30fc\u30eb\u3067\u3059\u3002<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-wp-embed\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"gUQsgMpR90\"><a href=\"https:\/\/techgym.jp\/tokyo\/tokyo_honko\/\">\u30c6\u30c3\u30af\u30b8\u30e0\u6771\u4eac\u672c\u6821<\/a><\/blockquote><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; visibility: hidden;\" title=\"&#8220;\u30c6\u30c3\u30af\u30b8\u30e0\u6771\u4eac\u672c\u6821&#8221; &#8212; \u3010\u30c6\u30c3\u30af\u30b8\u30e0\u3011\u683c\u5b89\u30fb\u5bfe\u9762\u578b\u30d7\u30ed\u30b0\u30e9\u30df\u30f3\u30b0\u30b9\u30af\u30fc\u30eb\" src=\"https:\/\/techgym.jp\/tokyo\/tokyo_honko\/embed\/#?secret=29wNp4C2vz#?secret=gUQsgMpR90\" data-secret=\"gUQsgMpR90\" width=\"600\" height=\"338\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><\/figure>\n\n\n\n<p>\uff1c\u77ed\u671f\u8b1b\u7fd2\uff1e5\u65e5\u30675\u4e07\u5186\u306e\u300cPython\u30df\u30cb\u30ad\u30e3\u30f3\u30d7\u300d\u958b\u50ac\u4e2d\u3002<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-wp-embed\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"U7LAnJvzlM\"><a href=\"https:\/\/techgym.jp\/event\/nagatacho_camp\/\">\u72ec\u5b66\u3082\u30aa\u30f3\u30e9\u30a4\u30f3\u3082\u7121\u7406\u3060\u304b\u3089\u3001\u6709\u7d66\u3068\u3063\u3066\u300cPython\u30df\u30cb\u30ad\u30e3\u30f3\u30d7\u300d\u3078\u30105\u65e5\u9593\u30675\u4e07\u5186\u3011<\/a><\/blockquote><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; visibility: hidden;\" title=\"&#8220;\u72ec\u5b66\u3082\u30aa\u30f3\u30e9\u30a4\u30f3\u3082\u7121\u7406\u3060\u304b\u3089\u3001\u6709\u7d66\u3068\u3063\u3066\u300cPython\u30df\u30cb\u30ad\u30e3\u30f3\u30d7\u300d\u3078\u30105\u65e5\u9593\u30675\u4e07\u5186\u3011&#8221; &#8212; \u3010\u30c6\u30c3\u30af\u30b8\u30e0\u3011\u683c\u5b89\u30fb\u5bfe\u9762\u578b\u30d7\u30ed\u30b0\u30e9\u30df\u30f3\u30b0\u30b9\u30af\u30fc\u30eb\" src=\"https:\/\/techgym.jp\/event\/nagatacho_camp\/embed\/#?secret=AzAMz9H8up#?secret=U7LAnJvzlM\" data-secret=\"U7LAnJvzlM\" width=\"600\" height=\"338\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><\/figure>\n\n\n\n<p>\uff1c\u67081\u958b\u50ac\uff1e\u653e\u9001\u4f5c\u5bb6\u306b\u3088\u308b\u6620\u50cf\u30c7\u30a3\u30ec\u30af\u30bf\u30fc\u990a\u6210\u8b1b\u5ea7<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-wp-embed\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"uYsbMuIQXN\"><a href=\"https:\/\/techgym.jp\/event\/video_director\/\">\u73fe\u5f79\u653e\u9001\u4f5c\u5bb6\u304c\u6559\u3048\u308b\u52d5\u753b\u8b1b\u5ea7\uff01\u300e\uff24\uff2f\uff27\uff21\u300f<\/a><\/blockquote><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; visibility: hidden;\" title=\"&#8220;\u73fe\u5f79\u653e\u9001\u4f5c\u5bb6\u304c\u6559\u3048\u308b\u52d5\u753b\u8b1b\u5ea7\uff01\u300e\uff24\uff2f\uff27\uff21\u300f&#8221; &#8212; \u3010\u30c6\u30c3\u30af\u30b8\u30e0\u3011\u683c\u5b89\u30fb\u5bfe\u9762\u578b\u30d7\u30ed\u30b0\u30e9\u30df\u30f3\u30b0\u30b9\u30af\u30fc\u30eb\" src=\"https:\/\/techgym.jp\/event\/video_director\/embed\/#?secret=xiRdxShJME#?secret=uYsbMuIQXN\" data-secret=\"uYsbMuIQXN\" width=\"600\" height=\"338\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><\/figure>\n\n\n\n<p>\uff1c\u30aa\u30f3\u30e9\u30a4\u30f3\u7121\u6599\uff1e\u30bc\u30ed\u304b\u3089\u59cb\u3081\u308bPython\u7206\u901f\u8b1b\u5ea7<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-wp-embed\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"b1YVYNkNqZ\"><a href=\"https:\/\/techgym.jp\/tokyo_python\/\">\u30bc\u30ed\u304b\u3089\u59cb\u3081\u308bPython\u7206\u901f\u8b1b\u5ea7\uff08\u7406\u7cfb\u30fb\u30d7\u30ed\u30b0\u30e9\u30df\u30f3\u30b0\u521d\u5fc3\u8005\u5411\u3051\uff09<\/a><\/blockquote><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; visibility: hidden;\" title=\"&#8220;\u30bc\u30ed\u304b\u3089\u59cb\u3081\u308bPython\u7206\u901f\u8b1b\u5ea7\uff08\u7406\u7cfb\u30fb\u30d7\u30ed\u30b0\u30e9\u30df\u30f3\u30b0\u521d\u5fc3\u8005\u5411\u3051\uff09&#8221; &#8212; \u3010\u30c6\u30c3\u30af\u30b8\u30e0\u3011\u683c\u5b89\u30fb\u5bfe\u9762\u578b\u30d7\u30ed\u30b0\u30e9\u30df\u30f3\u30b0\u30b9\u30af\u30fc\u30eb\" src=\"https:\/\/techgym.jp\/tokyo_python\/embed\/#?secret=eoD6qhrnJa#?secret=b1YVYNkNqZ\" data-secret=\"b1YVYNkNqZ\" width=\"600\" height=\"338\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>\u00a0 Web\u30b9\u30af\u30ec\u30a4\u30d4\u30f3\u30b0\u3067HTML\u3092\u89e3\u6790\u3057\u305f\u3044\u3051\u3069\u3001\u3069\u306e\u30e9\u30a4\u30d6\u30e9\u30ea\u3092\u4f7f\u3048\u3070\u3044\u3044\u304b\u8ff7\u3063\u3066\u3044\u307e\u305b\u3093\u304b\uff1fPython BeautifulSoup\u306f\u3001HTML\u3084XML\u306e\u89e3\u6790\u306b\u304a\u3044\u3066\u6700\u3082\u4eba\u6c17\u304c\u9ad8\u304f\u3001\u521d\u5fc3\u8005\u306b\u3082\u4f7f\u3044\u3084\u3059\u3044\u30e9\u30a4\u30d6\u30e9\u30ea\u3067 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":42501,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[5],"tags":[],"class_list":["post-43448","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-column"],"views":141,"jetpack_featured_media_url":"\/wp-content\/uploads\/2025\/07\/f3403acf5c65aedec0dba821c4c26404.png","jetpack_sharing_enabled":true,"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/techgym.jp\/wp-json\/wp\/v2\/posts\/43448","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/techgym.jp\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/techgym.jp\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/techgym.jp\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/techgym.jp\/wp-json\/wp\/v2\/comments?post=43448"}],"version-history":[{"count":0,"href":"https:\/\/techgym.jp\/wp-json\/wp\/v2\/posts\/43448\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/techgym.jp\/wp-json\/wp\/v2\/media\/42501"}],"wp:attachment":[{"href":"https:\/\/techgym.jp\/wp-json\/wp\/v2\/media?parent=43448"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/techgym.jp\/wp-json\/wp\/v2\/categories?post=43448"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/techgym.jp\/wp-json\/wp\/v2\/tags?post=43448"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}