0

zu überschreiten, stecke ich gerade auf ein "Scraping-Problem". Vor allem möchte ich den Namen des Autors von einer Webseite in Google Tabellenkalkulation extrahieren. Eigentlich funktioniert die Funktion = IMPORTXML (A2, "// span [@ class = 'author vcard meta-item']") funktioniert, aber nachdem ich die Anzahl der Links zum scrape erhöht habe, fängt es an endlos zu laden.Um das ImportXML-Limit in Google Spreadsheet

Also ich recherchierte und finde heraus, dass dieses Problem auf die Tatsache zurückzuführen ist, dass es eine Grenze von Google gibt.

Weiß jemand, das Limit zu überschreiten oder ein Skript, das ich "leicht kopieren" könnte? - Ich habe wirklich keine Ahnung von Codierung.

+0

Bitte Kasse [fragen]. –

Antwort

0

Es gibt kein solches Skript, das die Grenzen überschreitet. Da der Code auf einem Google-Computer (Server) ausgeführt wird, können Sie nicht betrügen. Einige Einschränkungen sind an Ihre Tabelle gebunden. Sie können also versuchen, mehrere Tabellen zu verwenden.

+0

danke, das ist eine gute Idee, aber das Problem ist, dass ich die genaue Grenze nicht kenne, um die Daten in verschiedene Tabellen zu teilen. Die importxml-Funktion benötigt auch eine sehr lange Zeit, bis sie die? Span-Klasse extrahieren kann? ich suche nach. – rookie4

1

Ich erstellte eine benutzerdefinierte Importfunktion, die alle Grenzen von IMPORTXML überwindet Ich habe ein Blatt mit dieser in etwa 800 Zellen und es funktioniert super.

Sie verwendet die benutzerdefinierten Skripts von Google Sheet (Extras> Skript-Editor ...) und durchsucht Inhalt mithilfe von Regex anstelle von xpath.

function importRegex(url, regexInput) { 
    var output = ''; 
    var fetchedUrl = UrlFetchApp.fetch(url, {muteHttpExceptions: true}); 
    if (fetchedUrl) { 
    var html = fetchedUrl.getContentText(); 
    if (html.length && regexInput.length) { 
     output = html.match(new RegExp(regexInput, 'i'))[1]; 
    } 
    } 
    // Grace period to not overload 
    Utilities.sleep(1000); 
    return unescapeHTML(output); 
} 

Sie können diese Funktion dann wie jede andere Funktion verwenden.

=importRegex("https://example.com", "<title>(.*)<\/title>")

Natürlich können Sie auch Zellen verweisen.

=importRegex(A2, "<title>(.*)<\/title>")

Wenn Sie wollen keine HTML-Entitäten in der Ausgabe angezeigt wird, können Sie diese Funktion verwenden.

var htmlEntities = { 
    nbsp: ' ', 
    cent: '¢', 
    pound: '£', 
    yen: '¥', 
    euro: '€', 
    copy: '©', 
    reg: '®', 
    lt: '<', 
    gt: '>', 
    mdash: '–', 
    ndash: '-', 
    quot: '"', 
    amp: '&', 
    apos: '\'' 
}; 

function unescapeHTML(str) { 
    return str.replace(/\&([^;]+);/g, function (entity, entityCode) { 
     var match; 

     if (entityCode in htmlEntities) { 
      return htmlEntities[entityCode]; 
     } else if (match = entityCode.match(/^#x([\da-fA-F]+)$/)) { 
      return String.fromCharCode(parseInt(match[1], 16)); 
     } else if (match = entityCode.match(/^#(\d+)$/)) { 
      return String.fromCharCode(~~match[1]); 
     } else { 
      return entity; 
     } 
    }); 
}; 

Alle zusammen ...

function importRegex(url, regexInput) { 
    var output = ''; 
    var fetchedUrl = UrlFetchApp.fetch(url, {muteHttpExceptions: true}); 
    if (fetchedUrl) { 
    var html = fetchedUrl.getContentText(); 
    if (html.length && regexInput.length) { 
     output = html.match(new RegExp(regexInput, 'i'))[1]; 
    } 
    } 
    // Grace period to not overload 
    Utilities.sleep(1000); 
    return unescapeHTML(output); 
} 

var htmlEntities = { 
    nbsp: ' ', 
    cent: '¢', 
    pound: '£', 
    yen: '¥', 
    euro: '€', 
    copy: '©', 
    reg: '®', 
    lt: '<', 
    gt: '>', 
    mdash: '–', 
    ndash: '-', 
    quot: '"', 
    amp: '&', 
    apos: '\'' 
}; 

function unescapeHTML(str) { 
    return str.replace(/\&([^;]+);/g, function (entity, entityCode) { 
     var match; 

     if (entityCode in htmlEntities) { 
      return htmlEntities[entityCode]; 
     } else if (match = entityCode.match(/^#x([\da-fA-F]+)$/)) { 
      return String.fromCharCode(parseInt(match[1], 16)); 
     } else if (match = entityCode.match(/^#(\d+)$/)) { 
      return String.fromCharCode(~~match[1]); 
     } else { 
      return entity; 
     } 
    }); 
}; 
Verwandte Themen