从 iframe 中抓取父页面 html

问题描述 投票:0回答:2

我有一个 iframe,用于从其父页面生成 PDF。 PDF 生成器 (ABCpdf) 需要一个 HTML 文件,然后将其转换。

我目前所做的是使用以下方法抓取父级的 HTML:

var temp;
temp=parent.document.body.parentNode.innerHTML;

然后我使用 iframe 中的表单将其提交到服务器,在服务器中删除 iframe 部分等内容,然后将其保存为 PDF 制作者的临时 HTML 文件。

然而,生成的 HTML 代码被破坏,用

<BODY>
代替
<body>
等,并且删除了 ID 周围的引号等。

有更好的方法来获取 HTML 吗?

我不只是将页面重新生成为 HTML 的原因是父页面是一个复杂的报告。它包含各种控件,允许用户显示/隐藏部分或对表中的行进行排序。所以我得到的 HTML 必须反映用户的自定义。

谢谢

javascript html web-scraping
2个回答
1
投票

正如 David 提到的,使用

innerHTML
,你几乎受到浏览器的支配。如果您想控制序列化,您可以自己遍历父文档的 DOM,将节点的字符串表示形式附加到缓冲区。这将花费更长的时间并涉及更多代码,但会导致对输出的完全控制。

类似这样的东西(伪代码):

function serializeAttributes(node, buffer) {
  for (attribute in node.attributes) {
    buffer.append(' ' + attribute.name + '="' + attribute.value + '"');
  }
}

function serializeChildren(node, buffer) {
  for (child in node.childNodes) {
    if (child is a text node) {
      buffer.append(child.value);
    } else if (child is an element) {
      // You can also add checks to avoid going into IFrames, etc.
      serializeElement(child, buffer);
    }
  }
}

function serizalizeElement(node, buffer) {
  buffer.append('<' + node.tagName); 
  serializeAttributes(node, buffer);
  if (node.hasChildren) {
    buffer.append('>');
    serializeChildren(node, buffer);
    buffer.append('</' + node.tagName + '>');
  } else {
    buffer.append('\>');
  }
}

serializeNode(window.parent.document);

1
投票

访问页面的 DOM 并序列化为 HTML 将以浏览器想要序列化的任何方式获取数据。就规范而言,大写标签名称并省略属性值周围的可选引号是可以的。

如果您想要原始来源,则需要使用 XHR 发出 HTTP 请求以获取最新信息。

© www.soinside.com 2019 - 2024. All rights reserved.