web-dev-qa-db-ja.com

ImportXMLを使用してHTMLタグとデータをプルする

ImportXMLを使用して、データとともにHTMLタグをプルできますか?

例えば:

importxml(A1,"//div[@id='qlist-wrapper']") on stackoverflow.com 

iD qlist-wrapperを持つdiv内のすべてのデータを内破形式でプルします。

関連する<div>sおよび<li>sおよび<ul>sとともにデータをプルする方法はありますか?

奇妙な要求は理解していますが、1か所で必要があるので、とにかくタグをデータと一緒にプルすることは本当に役立ちます。

2
HopeKing

いいえ、=importXMLはこの種のXMLフォーマットを提供しません。ただし、次のように script を使用して、HTMLタグを含むページの一部を取得できます。

function getHtml() {
  var text = UrlFetchApp.fetch("http://webapps.stackexchange.com").getContentText();
  var div = text.match(/<div id="qlist-wrapper">[\s\S]*(?=<div>\s*<a id="home-browse")/)[0];
  var qlist = XmlService.parse(div);
  var root = qlist.getRootElement();
  var list = root.getChild('div');
  var children = list.getChildren();
  var sheet = SpreadsheetApp.getActiveSheet();
  for (var i = 0; i < children.length; i++) {
    sheet.getRange(i+1, 1).setValue(XmlService.getPrettyFormat().format(children[i]));
  }
}

説明

最初の行は、ページのHTMLソースを取得します。 XmlService.parseで解析できる場合もありますが、スクリプトなどの複雑なページの場合、通常これは失敗します。このため、正規表現を使用してフラグメントのみを抽出し、解析します。解析後、 XmlService が提供するものは何でもできます。質問のリストを取得し、それらを読み取り可能なXML形式の個別のセルに入れます。もちろん、ここからさらに深く掘り下げて特定のXML要素を抽出できます。

重要な注意点は、Googleクローラーはサイトへの匿名の訪問者であるということです。匿名ユーザー向けにページが提供されますが、これは表示とは異なります。

<div class="question-summary narrow" id="question-summary-91365">
  <div onclick="window.location.href='/questions/91365/filtering-by-case-sensitive-string-equality'" class="cp">
    <div class="votes">
      <div class="mini-counts">
        <span title="2 votes">2</span>
      </div>
      <div>votes</div>
    </div>
    <div class="status answered-accepted" title="one of the answers was accepted as the correct answer">
      <div class="mini-counts">
        <span title="2 answers">2</span>
      </div>
      <div>answers</div>
    </div>
    <div class="views">
      <div class="mini-counts">
        <span title="41 views">41</span>
      </div>
      <div>views</div>
    </div>
  </div>
  <div class="summary">
    <h3>
      <a href="/questions/91365/filtering-by-case-sensitive-string-equality" class="question-hyperlink" title="I discovered (when answering this question) that string comparison in filter is case insensitive: the formulas =filter(A:A, B:B = &quot;Yes&quot;) and =filter(A:A, B:B = &quot;YES&quot;) have the same output.   ...">Filtering by case-sensitive string equality</a>
    </h3>
    <div class="tags t-google-spreadsheets">
      <a href="/questions/tagged/google-spreadsheets" class="post-tag" title="show questions tagged 'google-spreadsheets'" rel="tag">google-spreadsheets</a>
    </div>
    <div class="started">
      <a href="/questions/91365/filtering-by-case-sensitive-string-equality/?lastactivity" class="started-link">
        modified
        <span title="2016-03-30 19:42:07Z" class="relativetime">54 mins ago</span>
      </a>
      <a href="/users/79865/404">404</a>
      <span class="reputation-score" title="reputation score 11872" dir="ltr">11.9k</span>
    </div>
  </div>
</div>
1
user79865

結局のところ、これを行うことができます!

=importxml("http://stackoverflow.com","//div[@id='qlist-wrapper']//@*")

enter image description here

0