docs: function(articleContent) {
      this._cleanStyles(articleContent);
  
      // Check for data tables before we continue, to avoid removing items in
      // those tables, which will often be isolated even though they're
      // visually linked to other content-ful elements (text, images, etc.).
      this._markDataTables(articleContent);
  
      // Clean out junk from the article content
      this._cleanConditionally(articleContent, "form");
      this._cleanConditionally(articleContent, "fieldset");
      this._clean(articleContent, "object");
      this._clean(articleContent, "embed");
      this._clean(articleContent, "h1");
      this._clean(articleContent, "footer");
      this._clean(articleContent, "link");
      this._clean(articleContent, "aside");
  
      // Clean out elements have "share" in their id/class combinations from final top candidates,
      // which means we don't remove the top candidates even they have "share".
      this._forEachNode(articleContent.children, function(topCandidate) {
        this._cleanMatchedNodes(topCandidate, /share/);
      });
  
      // If there is only one h2 and its text content substantially equals article title,
      // they are probably using it as a header and not a subheader,
      // so remove it since we already extract the title separately.
      var h2 = articleContent.getElementsByTagName('h2');
      if (h2.length === 1) {
        var lengthSimilarRate = (h2[0].textContent.length - this._articleTitle.length) / this._articleTitle.length;
        if (Math.abs(lengthSimilarRate) < 0.5) {
          var titlesMatch = false;
          if (lengthSimilarRate > 0) {
            titlesMatch = h2[0].textContent.includes(this._articleTitle);
          } else {
            titlesMatch = this._articleTitle.includes(h2[0].textContent);
          }
          if (titlesMatch) {
            this._clean(articleContent, "h2");
          }
        }
      }
  
      this._clean(articleContent, "iframe");
      this._clean(articleContent, "input");
      this._clean(articleContent, "textarea");
      this._clean(articleContent, "select");
      this._clean(articleContent, "button");
      this._cleanHeaders(articleContent);
  
      // Do these last as the previous stuff may have removed junk
      // that will affect these
      this._cleanConditionally(articleContent, "table");
      this._cleanConditionally(articleContent, "ul");
      this._cleanConditionally(articleContent, "div");
  
      // Remove extra paragraphs
      this._removeNodes(articleContent.getElementsByTagName('p'), function (paragraph) {
        var imgCount = paragraph.getElementsByTagName('img').length;
        var embedCount = paragraph.getElementsByTagName('embed').length;
        var objectCount = paragraph.getElementsByTagName('object').length;
        // At this point, nasty iframes have been removed, only remain embedded video ones.
        var iframeCount = paragraph.getElementsByTagName('iframe').length;
        var totalCount = imgCount + embedCount + objectCount + iframeCount;
  
        return totalCount === 0 && !this._getInnerText(paragraph, false);
      });
  
      this._forEachNode(this._getAllNodesWithTag(articleContent, ["br"]), function(br) {
        var next = this._nextElement(br.nextSibling);
        if (next && next.tagName == "P")
          br.parentNode.removeChild(br);
      });
    }