当前xpathtest存在的问题。
1.一个网站有正文有两种页面格式而且url正则不能区分时,只能舍弃一种格式的网页。
2.当正文网页需要翻页时,只能拿到第一页的东西。http://www.cankaoxiaoxi.com/china/20180810/2308630.shtml
3.除了能直接get得到的网页;其他的都无能为力。
4.有些网站下一页不是普通的get请求,但是url有规律,这种情况也不能好好的支持。http://www.chinanews.com/scroll-news/news1.html
5.个别网站时间显示是 ‘今天’ ‘昨天’。。http://news.tjbh.com/gnnews/system/2018/08/10/030419987.shtml
6.个别网站信息在图片里,http://industry.cfi.cn/p20180809000540.html
7.xpath语法的问题:
httpcleaner 用的是xpath1.0版本; 网上也找不到其具体语法, 跟据经验列出以下几条:
- /text() 与 //text() 的效果一样。
- 正文里一般有p标签,我们有时用//p//text() 拿不到, 但是艳容能拿到(她用的代码跟我们不一样)。
- div[条件1][条件2] 这样多谓语的不支持
- div[last()-1]这样带有运算的不支持
- 不支持 | (或),如果支持的话,那么新新闻与旧新闻页面结构不一样的这种一个网站有多种不同的页面的情况就好办了
我这里提一个新的调用xml的方式:
现在是每一个xml都有与之对应的一个正则表达式。然后每进来一个url就去找第一个与之匹配的正则的那项的xml。
我想的方式是将每个种子url对应的xml预先就固定死。 举个例子:
<!--中国日报中文网
国际资讯:http://world.chinadaily.com.cn/node_1072287.htm
中文聚焦:http://cnews.chinadaily.com.cn/node_1132603.htm
中国要闻:http://china.chinadaily.com.cn/node_1143902.htm
财经头条:http://caijing.chinadaily.com.cn/node_1078506.htm
财经要闻:http://caijing.chinadaily.com.cn/node_53008184.htm
国际资讯:http://world.chinadaily.com.cn/node_1072287.htm
世界要闻:http://world.chinadaily.com.cn/node_1072269.htm
最热新闻:http://top.chinadaily.com.cn/node_53005370.htm
生活快讯:http://fashion.chinadaily.com.cn/node_53008176.htm
作者和来源是一起的
-->
<page name="chinadaily" parallelismHint="10" url="^http://.+?\.chinadaily\.com\.cn/node.+?htm$">
<item name="fetching_urls" type="MultipleResult" desc="中国日报网">//div[@class='busBox1']//h3//@href</item>
<item name="fetching_next_page" type="SingleResult" desc="下一页">//a[text()='下一页']/@href</item>
<item name="fetching_title" type="MultipleResult" desc="中国日报网新闻标题">//div[@class='busBox1']//h3//text()</item>
</page>
<page name="chinadaily" parallelismHint="10" url="^http://.+?\.chinadaily\.com\.cn/.+?content.+htm$">
<item name="title" type="SingleResult" desc="标题">//h1[@class='dabiaoti']/text()</item>
<item name="content" type="MultipleResult" desc="正文">//div[@id='Content']//text()</item>
<item name="timestamp" type="SingleResult" desc="提交时间">//div[@id='pubtime']//text()</item>
<item name="source" type="SingleResult" desc="中国日报网新闻来源">//div[@id='source']//text()</item>
<item name="nickname" type="SingleResult" desc="中国日报网新闻作者">//div[@id='source']//text()</item>
</page>
上面是我写的一个xml,我的意思是将种子url也同xpath一样预先写入配置文件;解析xml的时候直接将种子url拿出来让第一个xml解析,解析出来的正文url用第二项解析。这中间不需要正则的参与!如果一个网站对应超过2个xml项,那也只需加正则按照现在的xml来就好了。(我们写的大部分网站都只需要写两个xml,而且如果xpath支持或, 那么95%以上的网站都可以只写两个xml)
现在这种方式的话,我们遇到过一些问题,比如资产部今天调研了一个北京人民网,我今天写了北京人民的xml;但是过一段时间又调研了个湖南人民网,这样我又得回来看北京人民网是否与湖南的存在冲突!这有点难受。
如果以我说的这样就不会出现这种情况,我不需要去管过去写过什么。每两项或者多项xml与其种子url相对于其他的xml是独立的。
现在这样写也有优点的,我估计代码稍微好写一些,好控制线程一些吧!但是,如果能改成我这样的方式的话,我们写xpath的会舒服一些。 要不要改,还是要看相关人员思考一下看有没有必要,改代码复不复杂,这样改对以后还有没有帮助!