使用jQuery刮取HTML文档,可能吗?

使用jQuery刮取HTML文档,可能吗?,jquery,html,parsing,xpath,Jquery,Html,Parsing,Xpath,我希望能够抓取一个HTML页面并仅使用Javascript解析它,而不涉及服务器 假设我可以得到html响应(解决了跨域问题),我如何在完整的html文档上使用jQuery 示例如下(): 要分析子级的父页 $(文档).ready(函数(){ //数据如下所示: var html=“” html+='' html+='' html+='' html+=“要分析的子页” html+='' html+='' html+='' html+='' html+='' html+=“警报(“im java

我希望能够抓取一个HTML页面并仅使用Javascript解析它,而不涉及服务器

假设我可以得到html响应(解决了跨域问题),我如何在完整的html文档上使用jQuery

示例如下():


要分析子级的父页
$(文档).ready(函数(){
//数据如下所示:
var html=“”
html+=''
html+=''
html+=''
html+=“要分析的子页”
html+=''
html+=''
html+=''
html+=''
html+=''
html+=“警报(“im javascript”);”
html+=“setTimeout(函数(){”
html+='$(“body”).css(“背景色”,“#ffaaa”)'
html+='},400);'
html+=''
html+=''
html+=''
html+=''
//这很好:
//$(“#parent_div”).append(html);
//$(“儿童部”)
//.宽度(100)
//.身高(100)
//.css(“背景色”、“黄色”)
//.append(“子文本”

”; //…但那不是我想要做的。。。 //原因是:我不想将此子html页面添加到dom。。。 //我只是想从中获取数据。。。 //我想这样做,但每种情况下我都会得到空值: var meta=$(html).find(“meta”); 警报(meta.html()); var title=$(html).find(“title”); 警报(title.html()); });
问题是,
var child_body=$(数据)没有给我任何东西。我不确定应该如何使用jQuery遍历这个完整的html文档。我已经尝试删除
标记,但效果不大

这样的事情可能吗

我一直在胡闹,但这还不足以说明问题


有更合适的XPathJavaScript库吗?

如果您有一些HTML标记作为javascript字符串,您可以将其交给jQuery并对其进行解析

var tagSoup = '<html><head>.and so on..</html>';

var tag$ = $(tagSoup);

var someValue = tag$.find('#someId).val();
var tagSoup='.等等..';
变量标记$=$(标记);
var someValue=tag$.find('#someId).val();

使用一个?您可能仍然需要对得到的文本进行futz处理,但您至少已经将解析工作卸载到了浏览器上,希望浏览器知道它在做什么。它也不在页面的DOM中。

问题不完全在于jQuery,而在于浏览器
.innerHTML
实现中的差异。不同的浏览器以不同的方式处理此问题,例如在Opera中,您的示例运行良好,Firefox可以进行调整,在IE8中,它一半可以进行调整,而Chrome每次都可以进行调整

这一切都是关于他们如何处理
.innerHTML
调用的,这是什么时候发生的

,以及一些浏览器的结果:


Chrome 6(运行
警报()
,几乎去除所有内容):

  • 结果:
    • $(html).filter(“meta”).attr(“name”)
      :“关键字”
    • 已被剥离

Firefox 3.6(运行
警报()
,保留
内容,但再次作为顶级元素,):

  • 结果:
    • $(html).find(“meta”).attr(“name”)
      :“关键字”
    • $(html).find(“title”).html()
      :“要分析的子页”

因此,问题不在于jQuery本身,而在于不同浏览器在
.innerHTML
方法中做了什么,以去除它们想要的内容。这使得解析
中的任何内容都特别不可靠,请注意,当它被保留时,它可能是顶级元素,也可能不是顶级元素,例如
$(html)。长度将有所不同

我想说你有两种选择,但这两种选择都不太吸引人:

  • 通过服务器端呼叫发出请求,它会得到您想要的信息
  • 自己解析HTML,但在该部门jQuery不会给您带来太多好处

很抱歉,答案很糟糕,但除非您自己解析,否则跨浏览器问题似乎将成为这里的杀手,并使jQuery几乎毫无用处。

如果您提醒
数据
您会得到什么?很可能,
是主标记,您需要
$(数据)。过滤('body')
然后获取其内容。警报“data”为我提供了一个原始输出字符串,如注释中所示。这里有几件事,您插入的
未关闭,第二件事……您的目标是什么?这是一个实际的例子,还是您只是希望能够运行一些JavaScript?如果是这样的话,使用的另一种方法似乎更适合您的需要。@Nick,我想从一个完整的HTML文档中获取数据。既然我可以以字符串的形式获取HTML页面,那么如何使用jQuery将其删除,而不将其添加到DOM中呢。我添加了2个示例的要点,并更新了上面的示例,使其生效。他已经在这样做了,
$(html)
创建了一个文档片段:)不知道这一点。谢谢你的信息!
var tagSoup = '<html><head>.and so on..</html>';

var tag$ = $(tagSoup);

var someValue = tag$.find('#someId).val();
<div id="child_div"></div>
<META name=keywords content="parent, html, parsing">
<DIV id=child_div></DIV>
<title>Sub Page to Parse</title>
<meta name="keywords" content="parent, html, parsing">
<div id="child_div"></div> 
<head> 
  <title>Sub Page to Parse</title>
  <meta name="keywords" content="parent, html, parsing"> 
</head> 
<div id="child_div"></div>