95722


会社名をスクレイピングしたいのですが、同じサイトでも会社によってタグの数字が変化します。

以下のページで紹介されているParserは、Webスクレイピング用のライブラリです。

[【GAS】Parserライブラリの使い方｜インストール手順と使用方法](https://tetsuooo.net/gas/1944/)

例:

[code]

    <a href="/2024/company/r308300069/">
    <a href="/2024/company/r505050505/">
    
[/code]

この場合、以下のコードでは会社名だけをスクレイピングすることができません。  
正規表現か何かで、変動する数字の場所だけを抽象化して記述する方法はないでしょうか？

[code]

    function ScrapCOMP() {
      var spreadsheet = SpreadsheetApp.getActive();
      var sheetURL  = spreadsheet.setActiveSheet(spreadsheet.getSheetByName('URL貼り付け'), true);
      var sheetWork  = spreadsheet.setActiveSheet(spreadsheet.getSheetByName('ペースト&作業用シート'), true);
      
    for(i=2; i<=11; i++){
      var V   =  i   +    10;
      var r   =  i   -    1;
      let URL = sheetURL.getRange('A'  +   i).getValue();
      let response = UrlFetchApp.fetch(URL);
      let content = response.getContentText("utf-8");
      var COMPNAME = Parser.data(content).from('<a href="/2024/company/r308300069/">').to('</a>').iterate();
      console.log(COMPNAME);
      console.log(typeof(COMPNAME));
    }
    }
    
[/code]

ログの例

[code]

    ----------
    11:57:03    情報  [ 'head>\n<meta http-equiv="X-UA-Compatible" content="IE=Edge">\n<meta charset="UTF-8">\n<link rel="canonical" href="https://job.rikunabi.com/2024/company/r383010072/">\n<link rel="stylesheet" href="/2024/static/add/css/hon/company/top/ts-h-index.css">\n\n\n\t<script src="/2024/static/add/js/ima-polyfill.js"></script>\n\t<script src="/2024/static/add/js/browser-polyfill.min.js"></script>\n\t<!--[if lt IE 9]>\n\t\t<script src="/2024/static/add/js/console-polyfill.js"></script>\n\t\t<script src="/2024/static/add/js/classList.min.js"></script>\n\t\t<![endif]-->\n\t<script src="/2024/static/add/js/jquery.1.12.x.min.js"></script>\n\n<!-- BEGIN /intra/navg/meta/companyTop.jsp -->\r\n<title>株式会社真伯連合の新卒採用・企業情報2024</title>\r\n<meta name="description" content="株式会社真伯連合の2024年度新卒採用・企業情報。文系・理系不問。人物重視の採用。">\r\n<meta name="keywords" content="就活,就職活動,新卒採用">\r\n\r\n<!-- END /intra/navg/meta/companyTop.jsp -->\n\n<script>\nwindow.env = {\n     context:\'/2024\',\n     csrf: \'\'\n}\n</script>\n\n<!-- Start Visual Website Optimizer Asynchronous Code -->\n<script type=\'text/javascript\'>\nvar _vwo_code=(function(){\nvar account_id=290960,\nsettings_tolerance=2000,\nlibrary_tolerance=2500,\nuse_existing_jquery=false,\n/* DO NOT EDIT BELOW THIS LINE */\nf=false,d=document;return{use_existing_jquery:function(){return use_existing_jquery;},library_tolerance:function(){return library_tolerance;},finish:function(){if(!f){f=true;var a=d.getElementById(\'_vis_opt_path_hides\');if(a)a.parentNode.removeChild(a);}},finished:function(){return f;},load:function(a){var b=d.createElement(\'script\');b.src=a;b.type=\'text/javascript\';b.innerText;b.onerror=function(){_vwo_code.finish();};d.getElementsByTagName(\'head\')[0].appendChild(b);},init:function(){settings_timer=setTimeout(\'_vwo_code.finish()\',settings_tolerance);var a=d.createElement(\'style\'),b=\'body{opacity:0 !important;filter:alpha(opacity=0) !important;background:none !important;}\',h=d.getElementsByTagName(\'head\')[0];a.setAttribute(\'id\',\'_vis_opt_path_hides\');a.setAttribute(\'type\',\'text/css\');if(a.styleSheet)a.styleSheet.cssText=b;else a.appendChild(d.createTextNode(b));h.appendChild(a);this.load(\'//dev.visualwebsiteoptimizer.com/j.php?a=\'+account_id+\'&u=\'+encodeURIComponent(d.URL)+\'&r=\'+Math.random());return settings_timer;}};}());_vwo_settings_timer=_vwo_code.init();\n</script>\n<!-- End Visual Website Optimizer Asynchronous Code -->\n\n</head>\n\n<body>\n<div class="ts-h-l-root">\n<div class="ts-h-l-header">\n<div class="ts-h-l-header-container">\n<div class="ts-h-l-header-container-inner ts-s-cf">\n<div class="ts-h-l-header-logo">\n<a href="/2024/" target="_blank"><img src="/2024/static/common/contents/logos/rikunabiStu/image/popup_headerlogo.gif" alt="リクナビ2024" border="0">' ]
    11:57:03    情報  object
    
[/code]


CC BY-SA 4.0
2023-07-21T04:14:24.993
95717
2023-07-21T09:25:25.140
2023-07-21T09:25:25.140
3060
58928
question
javascript 正規表現 google-apps-script web-scraping google-spreadsheet
タグ名の変動するサイトからスクレイピングを行いたいです。


マッチしたい文字列の一部が変化する際は、正規表現を使う方法があります。

正規表現の例: `<a href="/[0-9]{4}/company/r[0-9]{9}/">(?<compName>.*?)</a>`

使用例:

[code]

    const html = `
    <p>
      <a href="/2024/company/not-this">not this</a>
      <a href="/2024/company/r308300069/">Foo社</a>
      <a href="/2024/company/r505050505/">Bar社</a> <a href="/2024/company/r505050505/">Baz社</a>
    </p>
    `
    
    const reg = new RegExp(`<a href="/[0-9]{4}/company/r[0-9]{9}/">(?<compName>.*?)</a>`, "g")
    
    for (const m of html.matchAll(reg)) {
      console.log(m.groups.compName)
    }
    
[/code]

HTMLの構造が単純であればこのような正規表現で十分なこともあります。ただし、扱うHTMLの構造が複雑になると、こういった単純な文字列処理によるアプローチは直ぐに破綻します。これは質問のコードで使用されているParserというライブラリも文字列をHTMLとして解析しているわけでは無いので同じなはずです。

そういった場合は、きちんとHTMLをパースする下記のようなライブラリを使うしか有りません。

  * [XML Service](https://developers.google.com/apps-script/reference/xml-service?hl=ja) （これはXMLとしてパースするので、HTMLによってはパースに失敗します）
  * [Cheerio for Google Apps Script](https://github.com/tani/cheeriogs) （これは、有名なライブラリ[cheerio](https://github.com/cheeriojs/cheerio)のApps Script版です。「cheerio」で検索すれば情報も得られ易いでしょう。）


CC BY-SA 4.0
2023-07-21T07:26:12.040
95722
2023-07-21T07:26:12.040
3054
95717
answer