1
will0404 2016-06-01 10:44:00 +08:00
浏览器端不清楚 ,如果是 node 环境可以用 cheerio 这个库
|
3
zenxds 2016-06-01 10:53:53 +08:00
用 createFragment 不就可以了
|
4
imn1 2016-06-01 11:00:56 +08:00
导入到不可视元素就可以 DOM 了
|
5
loading 2016-06-01 11:04:35 +08:00 via Android
没有用过 js 吗?
如果是固定的 html ,用 jQuery 就能处理了。 |
6
zhouyg 2016-06-01 12:17:41 +08:00
可以用 jquery 中带的那个搜索器
|
7
Arrowing 2016-06-01 12:23:57 +08:00
jquery 就可以吧
$('html') $('<html></html>') //文本内容 |
10
bigcoon 2016-06-01 14:41:19 +08:00
正则
|
12
xudd OP @bigcoon 现在就是用的正则,可是不知道为什么会卡死浏览器,我的代码是这样的
function doAjaxCall(the_request){ $.ajax({ type:"get", url:the_request, dataType:"html", success:function(result){ var ol = result+""; var regTitle = /shelf-title-table[^.]*(\s*)[^.]*(\n)*(\r)*(.*)[^.]*(\?)*?menu-container/gm; var mTitle,proName; var reg = /yt-shelf-grid-item[^.]*(\s*)[^.]*(\n)*(\r)*(.*)[^.]*(\?)*?yt-shelf-grid-item/gm; var m,i=0; $("#program").empty(); while(i<7){ mTitle = regTitle.exec(ol) //alert(regTitle.lastIndex) proName = mTitle[0].match(/branded-page-module-title-text(\s*?)(.*?)<\/span>/)[0].replace("branded-page-module-title-text\">","").replace("</span>",""); var str = '<div class="nav"><ul><li><span>'+proName+'</span></li></ul></div>'+ '<div class="zd_con" id="zdCon'+i+'"><ul id="programList'+i+'">'; var j = 0; strVertArr[i] = new Array(); reg.lastIndex = regTitle.lastIndex; while(j<5){ m = reg.exec(ol); var imgSrcURL = m[0].match(/src=".*?"/)[0].replace("src=\"","").replace("\"",""); var aHref = m[0].match(/href="\S*?"/)[0].replace("href=\"","http://www.youtube.com").replace("\"",""); var name = '';//m[0].match(/yt-lockup-title[^.]*?(\s*?)(.*?)<\/h3>/)[0].match(/title="\S*?"/)[0].replace("title=\"","").replace("\"",""); var description = '';//m[0].match(/<li>[^.]*(.*)(\s*)(.*)[^.]*<\/li>/)[0].replace("<li>","").replace("</li><li>","-").replace("</li>",""); if(j<5){ if(j==0) str += '<li><a id="a'+i+j+'" onkeydown="changeHome(event,\'\')" onfocus="return false;" '; else str += '<li><a id="a'+i+j+'" onkeydown="changeLoc(event,\'\')" onfocus="return false;" '; str += ' href="javascript:goToPlay(\'' + aHref + '\');" class="scale-item movies big-cover">'; str += '<img class="big-img" src="'+imgSrcURL+'" />'; str += '<span class="wz"><h3>'+name+'</h3><p>' + description +'</p></span></a></li>'; } strVertArr[i][j] = new AdItem(name,imgSrcURL,aHref,description); j++; //ol.replace(m[0]+"",""); } //alert(reg.lastIndex) str += '</ul></div>'; strArray[i] = str; i++; $("#program").append(str); //ol.replace(mTitle[0]+"",""); } $("#program").css("margin-bottom","20px"); $(".body-right").css("margin-top","0px"); } }); } |
14
imn1 2016-06-01 14:59:38 +08:00
|
15
pimin 2016-06-01 15:08:40 +08:00
楼主这个 js 是运行在盒子的浏览器,还是 web 端的浏览器啊?
如果是运行在盒子,不如中间加一层代理,就是做 API 返回 JSON,这样处理就简单得多,更省资源. 盒子性能优先,正则处理 HTML 开销并不比后台处理小. |
16
loginv2 2016-06-01 15:14:03 +08:00
@xudd 不清楚问题所在 但是可以肯定的是 把+=这种拼接字符串 改成数组 push 每一行内容 最后 join 起来 是一种优化 字符串拼的越多的时候 效果越明显
|
17
hronro 2016-06-01 15:28:30 +08:00
有个思路,就是把文本形式的 html ,直接插入到一个 display:none 的 div 中去,这样相当于可以通过浏览器原生的方法来解析 HTML ,而不用自己手动写 JS 来解析。当然实际性能如何,还需要具体测试
|
18
Arrowing 2016-06-01 17:09:57 +08:00
@xudd 正则性能一般写的性能都很差,好的正则和不好的正则差别十分大,一般不建议这样使用。
例子(不能跨域): $.ajax({ type:"get", url: 'https://cn.v2ex.com/t/282675', dataType:"html", success:function(result){ var htmlNode = $(result); console.log(htmlNode); }}); |
19
iyangyuan 2016-06-01 17:44:57 +08:00
innerHTML
|
20
ChiChou 2016-06-01 18:07:47 +08:00
|
21
ChiChou 2016-06-01 18:11:45 +08:00 1
楼主你给的代码看得太累了。既然你已经用了 jQuery ,也没有跨域的问题,那么用 jQuery 可以直接把返回的 HTML 构建出 DOM 树,包装成 jQuery 对象去访问里面的 dom 节点。然后用 css Query 去定位元素,并根据需要取 html() 或者 text() 就可以了。
一个参考的例子: http://stackoverflow.com/questions/20007721/parsing-returned-html-from-jquery-ajax-request |