基于CSS选择器的网页抽取浏览器使用说明书大全

优采云 发布时间: 2021-07-26 01:16

  基于CSS选择器的网页抽取浏览器使用说明书大全

  (在程序中,必须在\前加双引号和\才能转义。

  三.基于CSS选择器的网页提取

  浏览器收到服务器返回的html源代码后,会将网页解析成DOM树。 CSS Selector 基于DOM树的特性,广泛用于网页提取。目前最流行的网页提取组件Jsoup(Java)和BeautifulSoup(Python)都是基于CSS选择器的。

  对于上面的例子:

  

(标题)此内容不要被抽取

(正文)此内容要被抽取

(页脚)此内容不要被抽取

  使用 CSS 选择器将大大提高代码的可读性:

   public static void cssExtract() {

String html="" +

"(标题)此内容不要被抽取" +

"(正文)此内容要被抽取" +

"(页脚)此内容不要被抽取" +

"";

//Jsoup中的Document类表示网页的DOM树

Document doc= Jsoup.parse(html);

//利用select方法获取所有满足css选择器的Element集合

// (实际是一个Elements类型的对象)

//由于在本网页的结构中,只会有一个Element满足条件

// 因此只要返回集合中的第一个Element即可

Element main=doc.select("div[class=main]").first();

//main是一个Element对象,这里main对应了网页中

//的(正文)此内容要被抽取

//我们调用Element的text()方法即可提取中间的文字

if(main!=null){

System.out.println("抽取结果:"+main.text());

}else{

System.out.println("无抽取结果");

}

}

  CSS 选择器有标准规范,但 Jsoup (Java) 和 BeautifulSoup (Python) 等组件并没有完全按照规范实现 CSS 选择器。因此,在使用各个组件之前,最好先阅读组件文档中对CSS选择器的描述。

  Jsoup 是 CSS 选择器的更好实现。如果想了解CSS选择器的使用,建议阅读Jsoup的CSS选择器规范文档。

  浏览器中的javascript直接支持CSS选择器。如果电脑安装了firefox或chrome,打开浏览器,按F12(调出开发者界面),随机打开一个网页,选择控制台(Console)选项卡,进入Console

  document.querySelectorAll("a")

  按回车后发现页面中所有超链接都输出了,document.querySelectorAll(CSS选择器)获取页面中所有满足CSS选择器的元素,放到一个数组中返回。

  如果只想获取第一个满足CSS选择器的元素,可以使用document.querySelector(CSS选择器)方法。

  浏览器js中的CSS选择器与Jsoup(Java)和BeautifulSoup(Python)中实现的CSS选择器略有不同,但基本相同。

  四.基于机器学习的网页提取

  基于正则或CSS选择器(或xpath)的网页提取是基于包装器的网页提取。这种提取算法的共同问题是,对于不同结构的网页,必须制定不同的提取规则。 如果一个舆情系统需要监控10000个异构网站,需要编写和维护10000套抽取规则。自 2000 年以来,有人一直在研究如何使用机器学习方法,让程序无需手动规则即可从网页中提取所需信息。

  从目前的科研成果来看,基于机器学习的网页提取重点偏向于新闻网页内容的自动提取,即输入一个新闻网页,程序可以自动输出新闻标题、正文、时间和其他信息。新闻、博客、百科网站收录比较简单的结构化数据,基本满足{title, time, body}的结构,抽取目标很明确,机器学习算法也设计的很好。但是,电子商务、求职等各类网页所收录的结构化数据非常复杂,有的还存在嵌套,没有统一的抽取目标。很难为此类页面设计机器学习提取算法。

  本节主要介绍如何设计机器学习算法来提取网站中的新闻、博客、百科等正文信息,以下简称内容提取。

  基于机器学习的网页提取算法大致可以分为以下几类:

  三种算法中,第一种算法实现最好,效果最好。

  让我们简单描述一下这三种算法。如果你只是想在你的项目中使用这些算法,你只需要了解第一类算法即可。

  下面会提到一些论文,但请不要根据论文中自己的实验数据来判断算法的好坏。许多算法是面向早期网页设计的(即以表格为框架的网页),也有一些算法的实验数据。集覆盖范围相对较窄。如果可能,最好自己评估这些算法。

  4.1 基于启发式规则和无监督学习的网页提取算法

  基于启发式规则和无监督学习(第一类算法)的网页提取算法是目前最简单也是最好的方法。并且具有很高的通用性,即该算法对不同语言、不同结构的网页往往有效。

  这类早期的算法大多没有将网页解析为DOM树,而是将网页解析为token序列。例如,对于以下 html 源代码:

  

广告...(8字)

正文...(500字)

页脚...(6字)

  程序将其转换为令牌序列:

  标签(body),标签(div),文本,文本....(8次),标签(/div),标签(div),文本,文本...(500次),标签(/div),标签(div),文本,文本...(6次),标签(/div),标签(/body)

  早期有一种基于token序列的MSS算法(Maximum Subsequence Segmentation)。该算法有多个版本。一个版本为令牌序列中的每个令牌分配一个分数。评分规则如下:

  根据上面的评分规则和token序列,我们可以得到一个评分序列:

  -3.25,-3.25,1,1,1...(8次),-3.25,-3.25,1,1,1...(500次),-3.25,-3.25,1,1,1...(6次),-3.25,-3.25

  MSS算法认为在token序列中找到一个子序列,使得这个子序列中token对应的分数总和达到最大值,那么这个子序列就是网页中的文本换个角度理解这个规则,就是从html源字符串中找到一个子序列。这个子序列应该收录更多的文本和更少的标签,因为算法给了标签一个更大的绝对值。负分(-3.25),给文本一个较小的正分(1).

  如何从score序列中找到总和最大的子序列可以通过动态规划很好的解决。具体算法这里不给出。有兴趣的可以参考《Extracting Article Text from the Web with Maximum Subsequence Segmentation》论文,MSS算法效果不好,但是这篇论文认为可以代表很多早期的算法。

  还有其他版本的 MSS。上面我们说算法给label和text分别赋值-3.25和1,都是固定值。还有一个版本的 MSS(也在论文中),它使用 Naive Bayes Si 的方法计算标签和文本的分数。该版本的MSS虽然在一定程度上提升了效果,但仍不理想。

  无监督学习在第一类算法中也扮演着重要的角色。许多算法使用聚类方法自动将网页的文本和非文本分为两类。例如,在“CETR-Content Extraction via Tag Ratios”算法中,将网页分成多行文本,算法对每行文本计算2个特征,分别是下图中的横轴和纵轴,以及红色椭圆中的单元格。 (线),大部分是网页的正文,绿色椭圆中收录的单元格(线)大部分是非文本。使用k-means等聚类方法,可以很好地将正文和非文本分为两类。然后设计一些启发式算法来区分这两个类别中哪个是文本,哪个是非文本。

  

  早期的算法通常使用标记序列和字符序列作为计算特征的单位。从某种意义上说,这破坏了网页的结构,没有充分利用网页的功能。在后面的算法中,很多使用DOM树的Nodes作为特征计算的基本单位,比如“通过路径比提取Web新闻”和“通过文本密度提取基于Dom的内容”。这些算法仍然使用启发式规则和无监督学习,因为以DOM树的节点作为特征计算的基本单元,算法可以获得越来越多的特征,因此可以设计更好的启发式规则和无监督学习算法。这些算法在提取中是有效的。它通常比前面描述的算法高得多。由于提取时以DOM树的Node为单位,该算法也可以方便的保留文本的结构(主要是保持网页中文本的布局)。

  我们在WebCollector中实现了一流的算法(从1.12版本开始),可以直接从官网下载源码使用。

  4.2 基于分类器的网页提取算法(第二类机器学习提取算法)

  实现一个基于分类器的网页提取算法(第二种算法),大致流程如下:

  对于网页提取,特征设计是首要任务。有时使用的特定分类器并不那么重要。在使用相同特征的情况下,使用决策树、SVM、神经网络等不同分类器可能不会对提取效果产生太大影响。

  从工程的角度来看,过程中的第一步和第二步都比较困难。训练集的选择也很讲究,保证所选数据集中网页结构的多样性。例如,比较流行的文本结构是:

  

xxxx

xxxxxxxx

xxx

xxxxx

xxxx

  如果训练集中只有五六个网站页面,很可能这些网站的文字都是上述结构,而恰巧在特征设计中,有两个特征:

  假设使用决策树作为分类器,最终训练的模型很可能是:

  如果一个节点的标签类型为div,且其孩子节点中标签为p的节点超过3个,则这个节点对应网页的正文。

  虽然这个模型在训练数据集上可以取得很好的提取效果,但是很明显很多网站不符合这个规则。因此,训练集的选择对提取算法的效果影响很大。

  网页设计的风格在不断变化。早期的网页经常使用表格来构建整个网页的框架。现在的网页都喜欢用div来搭建网页框架。如果想让提取算法覆盖更长的时间,那么在设计特征时一定要尽量选择那些不易改变的特征。标签类型是一个很容易改变的特性,并且随着网页设计风格的变化而变化。因此,如前所述,强烈不建议使用标签类型作为训练特征。

  上述基于分类器的网页提取算法属于eager learning,即算法通过训练集生成模型(如决策树模型、神经网络模型等)。对应的懒惰学习是一种不预先通过训练集生成模型的算法。比较有名的KNN属于懒惰学习。

  一些提取算法使用KNN来选择提取算法。听起来可能有点绕。这是一个解释。假设有2个提取算法A和B,并且有3个网站site1、site2、site3。 2种算法对3个网站的提取效果(这里用0%-100%的数字表示,越大说明越好)如下:

  网站A 算法提取效果 B 算法提取效果

  站点 1

  90%

  70%

  站点 2

  80%

  85%

  site3

  60%

  87%

  可以看出,在site1上,算法A的提取效果优于算法B。在site2和site3上,算法B的提取效果更好。在实践中,这种情况非常普遍。所以有些人想设计一个分类器。该分类器不用于对文本和非文本进行分类,而是用于帮助选择提取算法。例如,在这个例子中,分类器应该告诉我们在提取site1中的网页时使用A算法以获得更好的结果。

  以图片为例,A算法对政府网站的提取效果更好,B算法对互联网新闻网站的提取效果更好。然后当我提取政府类别网站时,分类器应该会帮我选择A算法。

  这个分类器的实现可以使用KNN算法。需要提前准备数据集。数据集中有多个站点的网页。同时,需要维护一张表。该表告诉我们不同提取算法对每个站点的提取效果(其实只要知道在每个站点上,哪种算法的提取效果最好)。当遇到要提取的网页时,我们将该网页与数据集中的所有网页进行比较(效率极低),找到最相似的K个网页,然后查看K个网页,哪个网站的网页最多(例如, k= 7.其中六个网页来自CSDN新闻),然后我们选择本站最好的算法来提取这个未知网页。

  4.3 基于网页模板自动生成的网页提取算法

  基于网页模板自动生成的网页提取算法(第三类算法)有很多种。这是一个例子。在《URL Tree: Efficient Unsupervised Content Extraction from Streams of Web Documents》中,比较多个结构相同(根据URL判断)的页面,找出异同。页面之间的共同部分是非文本,页面之间的差异很大。该部分可能是文本。这很容易理解。例如,在某些网站中,所有网页页脚都相同,它们是记录信息或版权声明。这是页面之间的共性,所以算法认为这部分是非文本的。不同网页的文字往往不同,因此算法更容易识别文字页面。这种算法通常不会提取单个网页的文本,而是采集大量同质网页,同时提取多个网页。换句话说,不需要输入网页来实时提取。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线