web-dev-qa-db-fra.com

Utilisation de ImportXML pour extraire des balises HTML avec des données

Peut-on utiliser ImportXML pour extraire les balises HTML avec les données?

Par exemple:

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

va extraire toutes les données de la div avec l'id qlist-wrapper dans un format implosé.

Existe-t-il un moyen de récupérer les données avec les <div>s et <li>s et <ul>s pertinents?

Étrange demande, je comprends, mais j’ai un besoin à un endroit et, de toute façon, tirer les étiquettes avec les données sera très utile.

2
HopeKing

Non, =importXML n'offre pas ce type de formatage XML. Mais vous pouvez utiliser un script pour obtenir des parties d'une page avec des balises HTML, comme ceci:

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]));
  }
}

Explication

La première ligne récupère la source HTML de la page. Parfois, on peut l'analyser avec XmlService.parse, mais cela échoue généralement pour les pages complexes avec des scripts, etc. Pour cette raison, j'utilise une expression régulière pour extraire uniquement un fragment, puis l'analyse. Après l'analyse, on peut faire n'importe quoi XmlService offre: je viens d'obtenir une liste de questions et de les mettre dans des cellules séparées dans un format XML lisible. Vous pouvez bien sûr approfondir et extraire des éléments XML particuliers à partir d’ici.

Un inconvénient important est que Google crawler est un visiteur anonyme du site: la page est affichée pour les utilisateurs anonymes, ce qui est différent de ce que vous voyez.

<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

Donc il s'avère que vous pouvez le faire après tout!

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

enter image description here

0
Aurielle Perlmann