高分求助js内容抓取的问题

www_7di_net 2010-11-09 02:40:38
这几天一直在酝酿一个突破传统意义的新闻采集系统,传统的新闻采集系统是需要手工查看网页源代码,然后填写采集规则,但是针对大多数菜鸟来说这实在是太难了一点.
所以我希望可以通过点击显示页直接能对应的自动取得点击区域的html源码(这一点有点类似在线html编辑器),毕竟我们才是程序员,菜鸟们不会写正则我们可以让程序源码自动生成,宁可我们多费些功夫和脑子换来用户使用的简便性这才是王道,好了言归正传,进入正题

当我用程序取得目标网站的源码之后,假如取得的源码如下:

<div id="a">
<div id="c">
<b>内容</b>
</div>
</div>
<div id="b">其他内容</div>


而这段代码执行后的显示页效果可能是:
内容


我希望在显示效果页面上点击"内容"两个字的区域后,能够得到该页的源码,代码如下:
<b>内容</b>


我不可能在<div>上加js,例如<div onclick="alert(this.innerHTML)">,这种方法不可取的.因为毕竟这些html源代码是我从未知的网站上使用PHP采集获取而来的,所以我需要单独的写js函数来取得

请帮我解决这个难点.一旦将来开发完成,我会把采集系统免费奉送给大家.
...全文
329 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 sibang 的回复:]
至于是否繁琐这个问题,不是一个程序员该考虑的.因为如果想不繁琐,那就要求用户自己写采集规则的正则,这恐怕对用户来说台阶就太高了,与其如此不如我们繁琐一点,让用户轻松一点.
[/Quote]
你这是纯程序员的观点,不是商业思路。在商业上其实是反其道而行之。

另外,你说作开源。我现在对开源这个事情不抱好感或乐观想法,因为有太多现实中不良的发展和利用的事情出现。用句现代话说,不怕流氓,就怕流氓有文化。掌握了技术的流氓更可怕。
  • 打赏
  • 举报
回复
也许楼主要做的是许多CMS所包括的信息采集模块,或者是作为独立模块配备给任何需要采集填充信息的网站。这样的话,后台程序配合前台的选择,需要JS实现也在所难免。

但问题是,解决这样的问题,仅凭热心和闲心恐怕是不够的。而且这个问题,是关键,如果有人有能力并想要来做这件事情,完全可以自己去做,这个难点都不是问题,难道那些容易的方面还必须你的合作吗?无论是物质还是其他方面的利益,合作总是得建立在双赢的基础上,而这种明显只是人家单向向你付出的事情,想想也太不现实了。老老实实甩几万就得了。
  • 打赏
  • 举报
回复
想一下稍强大的HTML制作工具,都是软件,而在线编辑工具的功能相对还是弱,而且主要是编程相对更繁琐很多。
  • 打赏
  • 举报
回复
这个想法一点不新鲜,采集软件刚出来时,这个需求就自然已经被提出来了。
但是网页结构千变万化,其中某些技术的使用在实现这种需求的时候会造成意想不到的诸多困扰。
尤其是一些信息发布网站,有意地针对采集进行了一些防采集的措施和手段。
所以真正做好这一点的采集软件还没怎么听说。
不管怎么说,可以去尝试。但你可以用桌面软件,也可以用后台程序,而选择JS来做这件事情,的确很傻。
wuzhixuexi 2010-11-10
  • 打赏
  • 举报
回复
lz得这个想法有什么商业上的目的吗?为啥要通过js来做
firebugdotname 2010-11-10
  • 打赏
  • 举报
回复
sorry.



document.documentElement.addEventListener("click", function(e){
var target = e.target;
while(target){
// response target --> 输出节点层次供用户选择 ^__^
target = target.parentNode;
}

}, false);


firebugdotname 2010-11-10
  • 打赏
  • 举报
回复
我不知道我是否已经完全理解了楼主的意图。弱弱地说一下自己的想法。

既然希望用js实现获取某一层次的HTML片断,又是通过点击来选取的,那么是否可以在

documentElement对象上注册 onclick事件, 监听从最底层元素冒泡上来的click事件,


document.documentElement.addEventListener("click", function(e){
var target = e.target;
while(e.target){
// response e.target --> 输出节点层次供用户选择 ^__^
target = target.parentNode;
}

}, false);
www_7di_net 2010-11-10
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 theforever 的回复:]

这个想法一点不新鲜,采集软件刚出来时,这个需求就自然已经被提出来了。
但是网页结构千变万化,其中某些技术的使用在实现这种需求的时候会造成意想不到的诸多困扰。
尤其是一些信息发布网站,有意地针对采集进行了一些防采集的措施和手段。
所以真正做好这一点的采集软件还没怎么听说。
不管怎么说,可以去尝试。但你可以用桌面软件,也可以用后台程序,而选择JS来做这件事情,的确很傻。
[/Quote]
对,这个构思不是我提出来的,而是我看过有一个叫"易采"的CS程序是这么做的,但是他做的还不够好,但是想法却很棒,所以我希望可以通过BS的方式来实现,而使用PHP配合js来做应该是可以做到的,我曾看过一个在线web编辑器(具体的名字我忘记了),他可以做到像dreamweaver似的,在编辑窗口有标签的层次导航,既然js能够分解html源码取得标签层次导航,那么抓取某个层次的标签在理论上是可以实现的.

[Quote=引用 9 楼 theforever 的回复:]
想一下稍强大的HTML制作工具,都是软件,而在线编辑工具的功能相对还是弱,而且主要是编程相对更繁琐很多。
[/Quote]
相对于CS程序来说BS程序在这方面确实不占优势,但是只要理论上能够实现,我相信总有一天我会把他做出来,至于是否繁琐这个问题,不是一个程序员该考虑的.因为如果想不繁琐,那就要求用户自己写采集规则的正则,这恐怕对用户来说台阶就太高了,与其如此不如我们繁琐一点,让用户轻松一点.

[Quote=引用 10 楼 theforever 的回复:]
也许楼主要做的是许多CMS所包括的信息采集模块,或者是作为独立模块配备给任何需要采集填充信息的网站。这样的话,后台程序配合前台的选择,需要JS实现也在所难免。

但问题是,解决这样的问题,仅凭热心和闲心恐怕是不够的。而且这个问题,是关键,如果有人有能力并想要来做这件事情,完全可以自己去做,这个难点都不是问题,难道那些容易的方面还必须你的合作吗?无论是物质还是其他方面的利益,合作总是得建立在双赢的基础上,而这种明显只是人家单向向你付出的事情,想想也太不现实了。老老实实甩几万就得了。
[/Quote]
我做这个的目的实际上不是为了CMS,也不是为了发布独立模块,我就是喜欢"易采"的那个采集思路而已,但是他们做的还不够好,他们的那个存在兼容性问题,很多网站在他的软件里边打开之后没有滚动条,所以在设置页面下方的一些规则的时候就没办法设置,并且他的那个软件虽然是国人开发的,但是注册费用一千多块,所以我希望使用同样的思路开发一个CS的软件,当然了,我会做开源免费.
另外我发问这个问题的目的不是为了寻求合作,也不是为了盈利,至于你所谓的合作双赢之类的内容是不存在的.其实我发问的目的就是单纯的希望有在这方面的技术上有独到见解的朋友能够提供给我一点帮助而已,如果你的回复单纯是为了给我上思想教育课,我想那就大可不必了.


[Quote=引用 11 楼 hch126163 的回复:]
采集是针对不同的网站(不同html 布局)配置不同的采集方案! 都是有针对性的!!!!
不可能你一个规则 就可以解决所有问题的!
[/Quote]
请问我什么时候说过我要使用一个规则就想解决所有的问题?
hch126163 2010-11-10
  • 打赏
  • 举报
回复
采集是针对不同的网站(不同html 布局)配置不同的采集方案! 都是有针对性的!!!!

不可能你一个规则 就可以解决所有问题的!
sohighthesky 2010-11-09
  • 打赏
  • 举报
回复
没见过js能抓取网站的。
www_7di_net 2010-11-09
  • 打赏
  • 举报
回复
如果我操作的是自己网站的代码,那么像3楼的说法或许没问题,但是我现在操作的网页源代码来自于任意未知网站,所以就不用我说了吧!
www_7di_net 2010-11-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hch126163 的回复:]
var str='<div id="a"><div id="c"><b>内容asd<b>fsaas</b>fddf</b></div></div><div id="b">其他内容</div>';
alert(str.match(/(<b>.+(?=<\/b>\s*<\/div>\s*<\/div>)<\/b>)/gi));
[/Quote]

你的回答言不对意,你可能还没有理解我说什么,请仔细阅读我的需求
Crazywa 2010-11-09
  • 打赏
  • 举报
回复
问题在于。。html标签的无限级配对。
当然,不需要无限级。
但是嵌套二十级呢?
这是个问题。
hch126163 2010-11-09
  • 打赏
  • 举报
回复
var str='<div id="a"><div id="c"><b>内容asd<b>fsaas</b>fddf</b></div></div><div id="b">其他内容</div>';
alert(str.match(/(<b>.+(?=<\/b>\s*<\/div>\s*<\/div>)<\/b>)/gi));
hch126163 2010-11-09
  • 打赏
  • 举报
回复
你获取回来的是一段html 代码!

针对不同网站,正则处理一下就可以了

var str='<div id="a"><div id="c"><b>内容</b></div></div><div id="b">其他内容</div>';
alert(str.match(/(<b>.+(?=<\/b>\s*<\/div>\s*<\/div>)<\/b>)/gi));

87,907

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧