作者:張張張張 github地址:https://github.com/zhanghekai 【转载请注明出处,谢谢!】
《VIPS: A VIsion based Page Segmentation Algorithm(基于视觉信息的网页分块算法)》是Deng Cai等人与2003年发表的论文,该论文在网页信息采集方面有巨大的影响。 原文地址 为 方 便 书 写 与 理 解 , 本 博 客 正 文 中 出 现 的 “ 我 们 ” 均 为 该 论 文 作 者 , 而 本 人 的 一 些 浅 谈 理 解 写 入 蓝 底 注 释 框 中 ! \color{red}{为方便书写与理解,本博客正文中出现的“我们”均为该论文作者,} \\ \color{red}{而本人的一些浅谈理解 写入蓝底注释框中!} 为 方 便 书 写 与 理 解 , 本 博 客 正 文 中 出 现 的 “ 我 们 ” 均 为 该 论 文 作 者 , 而 本 人 的 一 些 浅 谈 理 解 写 入 蓝 底 注 释 框 中 !
一、网页的基于视觉的内容结构
\qquad 与[Chen et al. 2001]相似,我们将基本对象定义为DOM树中无法再分解的叶节点。 在本文中,我们提出了基于视觉的内容结构,其中每个节点(称为块)是一个基本对象或一组基本对象。 重要的是要注意,基于视觉的内容结构中的节点不一定与DOM树中的节点相对应。类似于 [Tang et al. 1999]中对文档表示的描述,基于视觉的网页内容结构 的基本模型描述如下: \qquad 对于每一个页面而言,我们可以将其看作一个三元组 Ω = ( O , Φ , δ ) \Omega=(Ο,\Phi,\delta) Ω = ( O , Φ , δ ) ,其中:
O = ( Ω 1 , Ω 2 , ⋯ , Ω N ) Ο=(\Omega^1,\Omega^2,\cdots,\Omega^N) O = ( Ω 1 , Ω 2 , ⋯ , Ω N ) ,表示给定页面上的所有的语义块的集合,这些语义块之间没有重叠覆盖,而每一个语义块 Ω i \Omega^i Ω i 又可以被定义为前面所描述的三元组 Ω i = ( O i , Φ i , δ i ) \Omega^i = (Ο^i,\Phi^i,\delta^i) Ω i = ( O i , Φ i , δ i ) ,如此迭代循环;
Φ = ( Φ 1 , Φ 2 , ⋯ , Φ T ) \Phi=( \Phi^1,\Phi^2,\cdots,\Phi^T ) Φ = ( Φ 1 , Φ 2 , ⋯ , Φ T ) ,表示当前页面上的所有的分隔条的集合,包括水平分隔符和垂直分隔符。每个分隔符都有一个表示其可见性的权重,并且同一 Φ \Phi Φ 集合中的所有分隔符都具有相同的权重。
事实上,一旦确定了一个页面上的两个语义块,那么这两个语义块之间的分隔条也就被确定了。当然,VIPS中的分隔条并不是真正存在的分隔条,而是虚拟。
δ \delta δ 描述了 O Ο O 集合中两个语义块之间的关系,这种关系可以用下面的式子描述: δ = O × O → Φ ∪ N U L L δ =Ο×Ο→Φ∪{NULL} δ = O × O → Φ ∪ N U L L 。例如: 假设 Ω i \Omega^i Ω i 和 Ω j \Omega^j Ω j 是集合 O Ο O 中的两个对象, δ ( Ω i , Ω j ) ≠ \delta (\Omega^i, \Omega^j) \neq δ ( Ω i , Ω j ) = N U L L NULL N U L L 表明 Ω i \Omega^i Ω i 和 Ω j \Omega^j Ω j 被分隔符 δ ( Ω i , Ω j ) \delta (\Omega^i, \Omega^j) δ ( Ω i , Ω j ) 直接分割,或者我们可以说这两个对象彼此相邻,否则,两个块 Ω i \Omega^i Ω i 和 Ω j \Omega^j Ω j 之间还有其他对象。
举例说明: \qquad 上图演示了Yahoo页面的基于视觉的Web页面内容结构。它同时给出了页面的布局结构和基于视觉的内容结构。在第一层,整个原有的页面被分割为四个对象(可视化块)VB1-VB4,同时在这四个对象之间检测出了三个分隔条 φ 1 \varphi_1 φ 1 ~ φ 3 \varphi_3 φ 3 (原来有五个,最上面的和最下面的被舍弃)。如上图(d)所示。 \qquad 检测出的四个可视对象并不是这轮分割的最终的局部。最终得到的语义块必须根据检测出的四个可视对象和三个分隔条进一步构建而成,如上图(e)所示。其中可能需要合并一些语义块,舍弃一些分隔条等等。
\qquad 对于每一个可视化块,VIPS算法都定义一个连贯程度 (Degree of Coherence,DoC)与之对应。该值的大小反映了当前语义块内部内容联系的紧密程度。它具有下面两个重要的特性:
DoC的值越大,则语义块内部 的内容之间的联系紧密程度就越大,它们之间关系就越连续,反之越小。
在层次树中,语义块子块的DoC的值肯定要比父块的值大。
\qquad 在 VIPS算法中,DoC的值位于1到10之间。不过这个范围是可以更改的。在对Web页面进行语义分割之前,我们首先设定一个预定义DoC值 PDoC(Permitted Degree of Coherence),通过该值来限定分割的语义块的粗糙程度。当语义块的DoC值达到PDoC之后,迭代分割就停止。PDoC越小,则分割的语义块就越 粗糙,反之,分割的语义块就越精细。 比如上图中,如果给出一个适当的PDoC的值,VB2_1块将变的不再允许分割。不同的应用程序可以设置不同的 PDoC值来达到自己的要求。
\qquad 基于视觉的页面分割最主要的目的 就是对给定的页面进行语义分割,因此分割后生成的基于视觉的内容结构中的结点通常总是一定的语义单位,包含一定的语义。比如在图1(a)中,我们可以看到VB2_1_1表示Yahoo宠物商店的目录链接,而VB2_2_1和VB2_2_2则表明了两种不同的 comics。
二、VIPS算法描述
\qquad 这部分我们将详细介绍VIPS算法。整体来说,页面的基于视觉的内容结构是结合DOM树以及一些视觉提示信息而得到的。分段过程如图2所示。它具有三个步骤:页面块提取、分隔条提取以及语义块重构。 这三个步骤总体上视为一轮。 该算法是自顶向下 的。 首先将网页分为几个大块,并记录该级别的层次结构。 对于每个大块,递归地执行相同的分段过程,直到获得的DoC值大于预定义PDoC的为止。
\qquad 在每次迭代循环中,都从Web浏览器获得其可视信息对应于当前块(第一回合的页面)的DOM树,如图3所示。然后,从DOM树的根结点开始,开始可视块提取过程,以根据视觉提示从DOM树中提取块。每一个DOM结点(图3b中的结点1,2,3,4,5,6,7)都会被检查它能否构成一个单独的语义块。如果不能,比如图3b 中的 1,3,4结点,那么它的子结点将被执行同样的检查。对于每一个提取出来的页面块,比如图3b中的2,5,6,7结点,我们都会根据当前页面块的内部可视属性赋予一个DoC值。当本次迭代过程中所有的页面块都被检测出来之后,它们将被保存到页面块池中 。基于这些页面块,分隔条检测过程将开始工作。这些页面块之间的所有的水平分隔条和垂直分隔条最终将被识别出来并且赋予一定的权重。基于这些分隔条,页面的布局层次将被重新构建。一些页面块将被合并, 形成语义块。最终,本次迭代过程中的所有语义块都被检测出来。
\qquad 迭代过程是否需要继续进行取决于本层次的语义块中是否存在DoC值小于PdoC的语义块。对于那些DoC>=PdoC的语义块,分隔过程将停止,否则分隔过程将继续。比如再下图中,语义块C的DoC值小于PdoC,那么该语义块将被作为新的子Web页面,继续执行分割算法,最终又被分割为两部 分:C1 和C2,如图4a和4b所示:
\qquad 当所有的语义块被提取出来后,最终整个Web页面的基于视觉的内容结构也就构建完成。在上面的例子中,我们最终获取的内容层次结构如图5所示。在下面的部分我们将详细的描述语义块的检测、分隔条的检测以及内容结构重建过程。
三、可视块提取
\qquad 在这一步中,我们旨在查找当前子页面中包含的所有合适的可视块。 通常,DOM树中的每个节点都可以代表一个可视块。 但是,某些“巨大”节点(例如
和)仅用于组织目的,不适合表示单个可视块。 在这些情况下,当前节点应进一步划分并由其子节点代替。 而且,由于HTML语法的灵活性,许多网页不能完全遵守W3C HTML规范,因此DOM树不能始终反映出不同DOM节点的真实关系。 \qquad 对于提取出来的每一个可视块,我们将根据它的内部的视觉差异设置它的DoC值。重复此过程,直到找到所有合适的节点代表当前子页面中的可视块为止。整个迭代提取过程可以用下面的算法描述:
\qquad 节点分割依据: 我们基于以下考虑判断DOM节点是否可以划分:
DOM结点本身的属性。比如当前DOM结点的标签,结点的背景色,当前结点所代表的可视块的大小,形状。
当前DOM结点的孩子结点。比如孩子结点的标签,孩子结点所代表的区域的背景色,前景色,区域的大小以及不同类型的孩子的数目等等。
\qquad 基于WWW HTML规范4.0,我们将DOM结点分为两大类:inline结点 和line-break结点 。
所谓inline结点是指 :如果该结点的标签能够影响文字的外观同时不会引起换行的话,那么这类结点我们称之为Inline结点,比 如、、、、、、 等等,这类结点通常仅仅影响文字的外观而不会影响文字的布局。
所谓line-break结点: 则就是除了inline结点之外的所有结点。
\qquad 根据节点在浏览器上的外观以及该节点的子级属性,我们给出一些定义:
有效结点(Valid node): 如果一个结点能够在浏览器中表现出来,那么这个结点就是有效结点。通常有效结点的长度和宽度都不为零。另外如果一个结点内部没有任何有用的信息,我们也称之为无效结点 。比如图7中的第二个和第四个TR结点都是无效结点;
文本结点: 这类结点通常是指HTML中的文字,通常它们不被任何标签所包围;
虚拟文本结点(这个定义是递归定义):
如果一个结点是文本结点,那么它自然就是虚拟文本结点;
如果一个结点是inline结点,并且它的所有子结点要么是文本结点,要么是虚拟文本结点,那么这个结点也就是虚拟文本结点。
如果一段文字加上了、、等标签之后,该文字只是在浏览器中的显示外观发生了变化而已,并不影响这段文字本质上为文字的属性,VIPS中将之称之为虚拟文本结点,并不难理解。
\qquad 可视语义块的提取算法DivideDomtree如图6所示。在该算法中用于产生启发式规则的一些重要线索包括:
标签提示:
一些标签比如 通常用来从视觉上分隔不同主题的内容。因此如果DOM结点中包含这些标签,那么我们倾向于认为该结点允许被继续分割。
如果inline结点的孩子结点存在line-break结点,那么该结点将被倾向于被分割。
色彩提示: 如果当前结点的孩子结点中有一个结点的背景色与它的背景色不同,那么我们倾向于分割该DOM结点。同时,具有不同背景色的节点在本次循环中不再被分割。分割由下一次迭代完成。
文本提示: 如果当前结点的大部分孩子结点都是文本结点或者是虚拟文本结点,那么我们倾向于不再继续分割该结点。
尺寸提示: 我们通常可以对不同的结点类型预定义一个门槛尺寸(结点的大小与整个页面大小的比较),如果结点的相对尺寸小于门槛大小,那么分割就停止。
\qquad 基于上面的这些提示信息,我们给出一些推理规则用以判断当前的结点是否应该被分割。如果一个结点不需要再分割,那么该结点块将被提取出来,同时设置相应得DoC值,并保存到页面块池中。推理规则如下表所示:
如果当前结点不是文本结点,同时它又没有任何有效的孩子结点,那么该结点将不被分割,并且从结点集合中删除。
如果当前结点只有一个有效的孩子结点,同时该孩子结点不是文本结点,那么当前结点将被分割。
如果当前的DOM结点是整个子DOM树的根结点(与页面块对应),同时只有一个子DOM树与当前的页面块关联,那么分割该结点。
如果当前结点的所有的孩子结点都是文本结点或者是虚拟文本结点,那么不分割该节点。如果当前所有孩子结点的字体大小和字体重量都是相同的,那么该页面块的DoC设置为10,否则设置为9。
如果当前DOM结点的孩子结点中有一个line-break结点,那么该结点将被继续分割。
如果当前结点的孩子结点中存在 结点,那么该结点将被继续分割。
如果所有孩子节点的尺寸之和大于DOM树节点的尺寸,那么分割该节点。
如果当前结点的背景色与它的所有子结点中的某个的背景色不相同,那么该结点将被分割,同时具有不同颜色的子结点在本次迭代中不分割,分割在下轮迭代中进行。与此同时,孩子结点的DoC的值根据标签和尺寸的不同设置为6-8。
如果结点至少具有一个文本或者虚拟文本子结点,同时结点的相对大小小于门槛大小,那么这个结点不再分割,同时根据标签的不同,DoC的值设置为5-8。
如果当前结点的所有子结点中最大的尺寸也小于门槛大小,那么该结点将不再分割,同时DoC值根据HTML标签和结点大小设置。
如果前一个兄弟结点没有被分割,那么该结点也不会被继续分割。
分割该结点。
不分割该结点,同时基于当前结点的标签和大小设置DoC值。
\qquad 对于不同的DOM结点,我们使用不同的推理规则:
\qquad 图7(b)显示的是一个表格,该表格是整个Web页面的一部分。它的DOM树结构显示在左边的部分。在页面块的提取过程中,当遇到
结点的时候,它只有一个有效的孩子结点。根据规则2,我们进入 标签。 该 结点具有五个孩子结点,但是它们中只有三个是有效结点。而且第一个孩子结点的背景颜色与父亲结点的颜色不同。 根据规则8,该 结点将被分割,而第一 个结点在本次迭代中不进行分割。第一个 结点被保存到可视块池中。第二个和第四个 结点为无效 结点,因此它们将被删除。对于第三个和第五个结点,根据推理规则11,在本次迭代中不再分割,因此最终我们得到三个页面块 VB2_1,VB2_2和VB2_3。
四、分隔条检测
\qquad 当所有的页面块被提取出来之后,它们都被保存在页面块池中以便进行分隔条检测。在VIPS算法中,分隔条是Web页面中的垂直的或者水平的行。从视觉的角度而言,分隔条在描述页面的不同语义信息方面具有很好的指示作用。在VIPS中,一个可视的分隔条可以用二维向量(Ps,Pe)描述,其中,Ps是分隔条的起始坐标,而Pe则是分隔条的终止坐标。坐标的单位全部为像素pixel。根据Ps和Pe,很容易计算当前分隔条的宽度和高度。
4.1 分隔条检测
分隔条的检测算法如下描述:
初始化分隔条列表。最早的分隔条列表中仅仅存在一个分隔条,它的起始和终止坐标为 ( P b e , P e e ) (P_{be},P_{ee}) ( P b e , P e e ) ,分别对应整个Web页面的起始坐标和终止坐标。
对于可视块池中的每一个可视块,它与分隔条的关系包括下面三种: a. 可视块被包含在分隔条中,此时,该分隔条将从页面块的边缘裂变为多个分隔条; b. 可视块与分隔条发生部分重合,那么根据可视块的边界重新调整分隔条的参数; c. 可视块跨越分隔条,那么此时移除该分隔条。
移除页面边缘的四个分隔条。
举例说明: \qquad 图8演示了分隔条的检测过程,其中黑色块代表页面中的可视块。为了简单起见,我们仅仅演示水平分隔条的检测过程。开始的时候我们只有一个大的分隔条,它的起始和终止位置就是整个页 面的起始和终止位置(既整个可视块池)。当我们将第一个可视块放入到池中的时候,由于该可视块被包含在分隔条内部,此时原有的分隔条将裂变为S1和S2。同理当第二个和第三个可视块放入到池中的时候,四个分隔条S1,S2,S3和 S4被检测出来。当第四个页面块放入到池中的时候,它跨越了S3分隔条,同时与S2分隔条有部分重合,此时S3分隔条将被删除,同时S2将被调整,从图中可以看出,调整后,S3明显的变细了。
4.2 设置分割条的权重
分隔条通常用于区别不同语义的页面块,因此基于给定分隔条两边的语义块的在视觉上的差异,我们可以设置分隔条的权重。如果分隔条的权重越重,该分隔条最终成为分隔条的可能性就越大。
下面的规则可以用来设置分隔条的权重:
分隔条两边的可视块的距离越远,该分隔条的权重就越高。
如果视觉分隔符与某些特定的HTML标签(例如 HTML标签)重叠,则其权重将设置为较高。
如果分隔条两侧的可视块的背景色是不相同的,那么该分隔条的权重将相应增高。
对于水平分隔条而言,如果分隔条两侧的可视块的字体属性,比如字体大小,字体重量是不同的,那么该分隔条的权重将增加。而且如果分隔条上侧的页面块的字体小于分隔条下侧的页面块的字体,那么分隔条的权重将增加。
对于水平分隔条而言,当分隔条两侧的可视块的结构非常相似,比如文本,那么该分隔条的权重将递减。
\qquad 考虑图7中的第三个
。与该结点对应的子页面如图9(b)所示,同时它的DOM树结构如图9(a)所示。我们可以看到根据我们的定义,该DOM树中的很多结点都是无效的,它们无法在浏览器中显示出来,在可视块的提取过程中,这些结点将被忽略。当这些页面块提取出来之后,六个页面块将保存到池中,同时五个水平分隔条也被检测出来。同时,基于 上面的五个分隔条规则,这些分隔条的权重将被设置。在本例中,可视块2和3之间的分割条要比页面块1和页面块2之间的分割条权重高,这是因为字体不同的原因。同样的原因,4和5之间的分隔条权重也高一些。最终的分隔条以及它们的权重如图9(c)所示,其中较粗的线表示较高的权重。
五、内容结构构建
\qquad 当分隔条被检测出来,同时权重设置完毕后,相应的内容重建过程就可以开始了。构建过程从最小权重的分隔条开始,该分隔条两侧的可视块将合并在一起组 成一个新的可视块。该合并过程不停的进行迭代,直到遇到权重最高的分隔条为止。对于每一个新的可视块,相应的DoC也被相应设置。
\qquad 当可视块最终合并成为语义块之后,本轮的迭代也就结束了。对于这些语义块,每一个语义块的DoC都会与PdoC进行对比,如果DoC的值小于 PdoC,那么新的迭代过程将重新开始:页面块检测,分隔条检测以及内容结构重构。当所有的语义块的DoC的值都不大于PdoC,迭代过程将停止。同时针对整个Web页面的内容结构将构建出来。
\qquad 以图9为例,在第一轮迭代中,第一,三以及五个分隔条 将被选择出来,同时页面块1和2被合并为新的语义块VB2_2_2_1。同样的合并发生在页面块3和4上,它们被合并为新的语义块VB2_2_2_2,页面块5和6最终合并为VB2_2_2_3。新的语义块VB2_2_2_1,VB2_2_2_2以及VB2_2_2_3是语义块VB2_2_2的子结点。对于每一个页面结点,比如VB2_2_2_2_1_1,VB2_2_2_1_1以及VB2_2_2_2_1它们的DoC的值将被检查,以便确定是否满足 PdoC的值。最终的内容结构构建完毕。
\qquad 综上,提出的VIPS算法利用视觉线索获得网页的基于视觉的内容结构,从而成功地弥合了DOM结构和语义结构之间的鸿沟。 该页面基于可视分隔符进行分区,并按层次结构进行组织。 这种语义层次在某种程度上与人类的感知相一致。 VIPS也非常有效。 由于我们跟踪用于可视块提取的DOM结构,并且没有分析每个基本的DOM节点,因此该算法完全是自顶向下的。
VIPS算法的首先从DOM树中提取出所有的合适的页面块,然后根据这些页面块检测出它们之间的所有的分割条,包括水平和垂直方向。最后基于这些分割条,Web页面的语义结构将被重新构建。对于每一个可视块又可以使用VIPS算法继续分割为更小的可视块。
Conclution
\qquad 该文章提出了一种基于视觉表示的Web内容结构提取新方法。生成的Web内容结构对于Web适应,信息检索和信息提取等应用程序非常有用。通过基于视觉布局信息识别Web内容的逻辑关系,Web内容结构可以有效地表示网页的语义结构。提出了一种自上而下,与标签树无关的可伸缩算法来检测Web内容结构。它模拟用户如何根据其视觉表示来理解网页的布局结构。与传统的基于DOM的分割方法相比,我们的方案利用了有用的视觉提示在语义级别获得了更好的页面划分。它也独立于物理实现,即使物理结构与视觉表示形式有很大差异,它也可以很好地工作。该算法在大数据集上进行了手动评估,并且还用于在Web信息检索的伪相关反馈过程中选择良好的扩展项,两者均取得了非常令人满意的性能。
【参考文献】
VIPS:基于视觉的Web页面分页算法
基于视觉信息的网页分块算法(VIPS)
\qquad 由于该论文年份较早,没有找到python可以运行的代码,但目前研究课题需要,所以我接下来会用python将该论文复现。如果大家谁有或谁知道该论文或vips类似的可视化块论文的代码,还劳烦留言告知一下~感激不尽!
你可能感兴趣的:(网页自动采集研究)
QQ群采集助手,精准引流必备神器
2401_87347160
其他 经验分享
功能概述微信群查找与筛选工具是一款专为微信用户设计的辅助工具,它通过关键词搜索功能,帮助用户快速找到相关的微信群,并提供筛选是否需要验证的群组的功能。主要功能关键词搜索:用户可以输入关键词,工具将自动查找包含该关键词的微信群。筛选功能:工具提供筛选机制,用户可以选择是否只显示需要验证或不需要验证的群组。精准引流:通过上述功能,用户可以更精准地找到目标群组,进行有效的引流操作。3.设备需求该工具可以
机器学习与深度学习间关系与区别
ℒℴѵℯ心·动ꦿ໊ོ꫞
人工智能 学习 深度学习 python
一、机器学习概述定义机器学习(MachineLearning,ML)是一种通过数据驱动的方法,利用统计学和计算算法来训练模型,使计算机能够从数据中学习并自动进行预测或决策。机器学习通过分析大量数据样本,识别其中的模式和规律,从而对新的数据进行判断。其核心在于通过训练过程,让模型不断优化和提升其预测准确性。主要类型1.监督学习(SupervisedLearning)监督学习是指在训练数据集中包含输入
UI学习——cell的复用和自定义cell
Magnetic_h
ui 学习
目录cell的复用手动(非注册)自动(注册)自定义cellcell的复用在iOS开发中,单元格复用是一种提高表格(UITableView)和集合视图(UICollectionView)滚动性能的技术。当一个UITableViewCell或UICollectionViewCell首次需要显示时,如果没有可复用的单元格,则视图会创建一个新的单元格。一旦这个单元格滚动出屏幕,它就不会被销毁。相反,它被添
Cell Insight | 单细胞测序技术又一新发现,可用于HIV-1和Mtb共感染个体诊断
尐尐呅
结核病是艾滋病合并其他疾病中导致患者死亡的主要原因。其中结核病由结核分枝杆菌(Mycobacteriumtuberculosis,Mtb)感染引起,获得性免疫缺陷综合症(艾滋病)由人免疫缺陷病毒(Humanimmunodeficiencyvirustype1,HIV-1)感染引起。国家感染性疾病临床医学研究中心/深圳市第三人民医院张国良团队携手深圳华大生命科学研究院吴靓团队,共同研究得出单细胞测序
扫地机类清洁产品之直流无刷电机控制
悟空胆好小
清洁服务机器人 单片机 人工智能
扫地机类清洁产品之直流无刷电机控制1.1前言扫地机产品有很多的电机控制,滚刷电机1个,边刷电机1-2个,清水泵电机,风机一个,部分中高端产品支持抹布功能,也就是存在抹布盘电机,还有追觅科沃斯石头等边刷抬升电机,滚刷抬升电机等的,这些电机有直流有刷电机,直接无刷电机,步进电机,电磁阀,挪动泵等不同类型。电机的原理,驱动控制方式也不行。接下来一段时间的几个文章会作个专题分析分享。直流有刷电机会自动持续
【一起学Rust | 设计模式】习惯语法——使用借用类型作为参数、格式化拼接字符串、构造函数
广龙宇
一起学Rust # Rust设计模式 rust 设计模式 开发语言
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、使用借用类型作为参数二、格式化拼接字符串三、使用构造函数总结前言Rust不是传统的面向对象编程语言,它的所有特性,使其独一无二。因此,学习特定于Rust的设计模式是必要的。本系列文章为作者学习《Rust设计模式》的学习笔记以及自己的见解。因此,本系列文章的结构也与此书的结构相同(后续可能会调成结构),基本上分为三个部分
Goolge earth studio 进阶4——路径修改与平滑
陟彼高冈yu
Google earth studio 进阶教程 旅游
如果我们希望在大约中途时获得更多的城市鸟瞰视角。可以将相机拖动到这里并创建一个新的关键帧。camera_target_clip_7EarthStudio会自动平滑我们的路径,所以当我们通过这个关键帧时,不是一个生硬的角度,而是一个平滑的曲线。camera_target_clip_8路径上有贝塞尔控制手柄,允许我们调整路径的形状。右键单击,我们可以选择“平滑路径”,这是默认的自动平滑算法,或者我们可
Python教程:一文了解使用Python处理XPath
旦莫
Python进阶 python 开发语言
目录1.环境准备1.1安装lxml1.2验证安装2.XPath基础2.1什么是XPath?2.2XPath语法2.3示例XML文档3.使用lxml解析XML3.1解析XML文档3.2查看解析结果4.XPath查询4.1基本路径查询4.2使用属性查询4.3查询多个节点5.XPath的高级用法5.1使用逻辑运算符5.2使用函数6.实战案例6.1从网页抓取数据6.1.1安装Requests库6.1.2代
DIV+CSS+JavaScript技术制作网页(旅游主题网页设计与制作)云南大理
STU学生网页设计
网页设计 期末网页作业 html静态网页 html5期末大作业 网页设计 web大作业
️精彩专栏推荐作者主页:【进入主页—获取更多源码】web前端期末大作业:【HTML5网页期末作业(1000套)】程序员有趣的告白方式:【HTML七夕情人节表白网页制作(110套)】文章目录二、网站介绍三、网站效果▶️1.视频演示2.图片演示四、网站代码HTML结构代码CSS样式代码五、更多源码二、网站介绍网站布局方面:计划采用目前主流的、能兼容各大主流浏览器、显示效果稳定的浮动网页布局结构。网站程
利用Requests Toolkit轻松完成HTTP请求
nseejrukjhad
http 网络协议 网络 python
RequestsToolkit的力量:轻松构建HTTP请求Agent在现代软件开发中,API请求是与外部服务交互的核心。RequestsToolkit提供了一种便捷的方式,帮助开发者构建自动化的HTTP请求Agent。本文旨在详细介绍RequestsToolkit的设置、使用和潜在挑战。引言RequestsToolkit是一个强大的工具包,可用于构建执行HTTP请求的智能代理。这对于想要自动化与外
深入理解 MultiQueryRetriever:提升向量数据库检索效果的强大工具
nseejrukjhad
数据库 python
深入理解MultiQueryRetriever:提升向量数据库检索效果的强大工具引言在人工智能和自然语言处理领域,高效准确的信息检索一直是一个关键挑战。传统的基于距离的向量数据库检索方法虽然广泛应用,但仍存在一些局限性。本文将介绍一种创新的解决方案:MultiQueryRetriever,它通过自动生成多个查询视角来增强检索效果,提高结果的相关性和多样性。MultiQueryRetriever的工
关于城市旅游的HTML网页设计——(旅游风景云南 5页)HTML+CSS+JavaScript
二挡起步
web前端期末大作业 javascript html css 旅游 风景
⛵源码获取文末联系✈Web前端开发技术描述网页设计题材,DIV+CSS布局制作,HTML+CSS网页设计期末课程大作业|游景点介绍|旅游风景区|家乡介绍|等网站的设计与制作|HTML期末大学生网页设计作业,Web大学生网页HTML:结构CSS:样式在操作方面上运用了html5和css3,采用了div+css结构、表单、超链接、浮动、绝对定位、相对定位、字体样式、引用视频等基础知识JavaScrip
HTML网页设计制作大作业(div+css) 云南我的家乡旅游景点 带文字滚动
二挡起步
web前端期末大作业 web设计网页规划与设计 html css javascript dreamweaver 前端
Web前端开发技术描述网页设计题材,DIV+CSS布局制作,HTML+CSS网页设计期末课程大作业游景点介绍|旅游风景区|家乡介绍|等网站的设计与制作HTML期末大学生网页设计作业HTML:结构CSS:样式在操作方面上运用了html5和css3,采用了div+css结构、表单、超链接、浮动、绝对定位、相对定位、字体样式、引用视频等基础知识JavaScript:做与用户的交互行为文章目录前端学习路线
git - Webhook让部署自动化
大猪大猪
我们现在有一个需求,将项目打包上传到gitlab或者github后,程序能自动部署,不用手动地去服务器中进行项目更新并运行,如何做到?这里我们可以使用gitlab与github的挂钩,挂钩的原理就是,每当我们有请求到gitlab与github服务器时,这时他俩会根据我们配置的挂钩地扯进行访问,webhook挂钩程序会一直监听着某个端口请求,一但收到他们发过来的请求,这时就知道用户有请求提交了,这时
webpack图片等资源的处理
dmengmeng
需要的loaderfile-loader(让我们可以引入这些资源文件)url-loader(其实是file-loader的二次封装)img-loader(处理图片所需要的)在没有使用任何处理图片的loader之前,比如说css中用到了背景图片,那么最后打包会报错的,因为他没办法处理图片。其实你只想能够使用图片的话。只加一个file-loader就可以,打开网页能准确看到图片。{test:/\.(p
走向以教育叙事为载体的教育叙事研究
666小飞鱼
今天我读了吴松超老师的《给教师的68条建写作建议》中的第23条《如何通过教育叙事走向研究》,吴老师在文中与我们分享了一个德育案例,这是一个反面的案例,意在告知我们在处理问题时,不能就考虑的点太窄,思考要全面。走向教育叙事研究,教师要有敏锐的“感知力”,这个感知力来自于背后专业知识的支撑,思维能力以及广阔的视野和见识等。所以对于同一件事处理方法不同,这个就是教师背后“敏锐力”的不同造成的,也就是说是
node.js学习
小猿L
node.js node.js 学习 vim
node.js学习实操及笔记温故node.js,node.js学习实操过程及笔记~node.js学习视频node.js官网node.js中文网实操笔记githubcsdn笔记为什么学node.js可以让别人访问我们编写的网页为后续的框架学习打下基础,三大框架vuereactangular离不开node.jsnode.js是什么官网:node.js是一个开源的、跨平台的运行JavaScript的运行
【华为OD技术面试真题 - 技术面】- python八股文真题题库(4)
算法大师
华为od 面试 python
华为OD面试真题精选专栏:华为OD面试真题精选目录:2024华为OD面试手撕代码真题目录以及八股文真题目录文章目录华为OD面试真题精选**1.Python中的`with`**用途和功能自动资源管理示例:文件操作上下文管理协议示例代码工作流程解析优点2.\_\_new\_\_和**\_\_init\_\_**区别__new____init__区别总结3.**切片(Slicing)操作**基本切片语法
基于CODESYS的多轴运动控制程序框架:逻辑与运动控制分离,快速开发灵活操作
GPJnCrbBdl
python 开发语言
基于codesys开发的多轴运动控制程序框架,将逻辑与运动控制分离,将单轴控制封装成功能块,对该功能块的操作包含了所有的单轴控制(归零、点动、相对定位、绝对定位、设置当前位置、伺服模式切换等等)。程序框架由主程序按照状态调用分归零模式、手动模式、自动模式、故障模式,程序状态的跳转都已完成,只需要根据不同的工艺要求完成所需的动作即可。变量的声明、地址的规划都严格按照C++的标准定义,能帮助开发者快速
【华为OD技术面试真题精选 - 非技术题】 -HR面,综合面_华为od hr面
一个射手座的程序媛
程序员 华为od 面试 职场和发展
最后的话最近很多小伙伴找我要Linux学习资料,于是我翻箱倒柜,整理了一些优质资源,涵盖视频、电子书、PPT等共享给大家!资料预览给大家整理的视频资料:给大家整理的电子书资料:如果本文对你有帮助,欢迎点赞、收藏、转发给朋友,让我有持续创作的动力!网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。需要这份系统化的资料的朋友,可以点击这里获
nosql数据库技术与应用知识点
皆过客,揽星河
NoSQL nosql 数据库 大数据 数据分析 数据结构 非关系型数据库
Nosql知识回顾大数据处理流程数据采集(flume、爬虫、传感器)数据存储(本门课程NoSQL所处的阶段)Hdfs、MongoDB、HBase等数据清洗(入仓)Hive等数据处理、分析(Spark、Flink等)数据可视化数据挖掘、机器学习应用(Python、SparkMLlib等)大数据时代存储的挑战(三高)高并发(同一时间很多人访问)高扩展(要求随时根据需求扩展存储)高效率(要求读写速度快)
insert into select 主键自增_mybatis拦截器实现主键自动生成
weixin_39521651
insert into select 主键自增 mybatis delete返回值 mybatis insert返回主键 mybatis insert返回对象 mybatis plus insert返回主键 mybatis plus 插入生成id
前言前阵子和朋友聊天,他说他们项目有个需求,要实现主键自动生成,不想每次新增的时候,都手动设置主键。于是我就问他,那你们数据库表设置主键自动递增不就得了。他的回答是他们项目目前的id都是采用雪花算法来生成,因此为了项目稳定性,不会切换id的生成方式。朋友问我有没有什么实现思路,他们公司的orm框架是mybatis,我就建议他说,不然让你老大把mybatis切换成mybatis-plus。mybat
厉国刚:新闻学与传播学到底有何区别
微观大道
厉国刚:新闻学与传播学到底有何区别头几天,有人在知乎上问我:新闻学与传播学到底有何区别。他是一位想要跨专业考研的学生,对新闻传播学学科可谓了解甚少,甚至一头雾水,想要让我帮他解释解释。在研究生学硕层面,新闻传播学是一级学科,分成新闻学、传播学这两个二级学科。有些高校,还自设了广告学、出版发行学等其他二级学科,但从官方角度,新闻传播学一级学科下,正统的就是那两个二级学科。招生时,一般会按一级学科招,
ES聚合分析原理与代码实例讲解
光剑书架上的书
大厂Offer收割机 面试题 简历 程序员读书 硅基计算 碳基计算 认知计算 生物计算 深度学习 神经网络 大数据 AIGC AGI LLM Java Python 架构设计 Agent 程序员实现财富自由
ES聚合分析原理与代码实例讲解1.背景介绍1.1问题的由来在大规模数据分析场景中,特别是在使用Elasticsearch(ES)进行数据存储和检索时,聚合分析成为了一个至关重要的功能。聚合分析允许用户对数据集进行细分和分组,以便深入探索数据的结构和模式。这在诸如实时监控、日志分析、业务洞察等领域具有广泛的应用。1.2研究现状目前,ES聚合分析已经成为现代大数据平台的核心组件之一。它支持多种类型的聚
ExpRe[25] bash外的其它shell:zsh和fish
tritone
ExpRe bash linux ubuntu shell
文章目录zsh基础配置实用特性插件`autojump`语法高亮自动补全fish优点缺点时效性本篇撰写时间为2021.12.15,由于计算机技术日新月异,博客中所有内容都有时效和版本限制,具体做法不一定总行得通,链接可能改动失效,各种软件的用法可能有修改。但是其中透露的思想往往是值得学习的。本篇前置:ExpRe[10]Ubuntu[2]准备神秘软件、备份恢复软件https://www.cnblogs
2022-08-28
蔚蓝一片晴
初三暑假培训收获点滴从8月25至8月27日三天两晚的培训结束了,回到家中,该静下心来整理一下触动心灵的收获,成为成长的积淀。1.在优秀团队中快速成长与提升,做一名反思成长型教师一名专业型教师的教学指导包括了教学原理知识、案例知识、策略知识。面对教学中的遇到的有趣的情形、问题会去研究其理,寻找更好的教法学法对策。从新手到成熟型教师,再走向专业型教师,需要的是觉醒与反思,多进行案例研究,从案例中观察、
TDengine 签约前晨汽车,解锁智能出行的无限潜力
涛思数据(TDengine)
tdengine 汽车 大数据
在全球汽车产业转型升级的背景下,智能网联和新能源技术正迅速成为商用车行业的重要发展方向。随着市场对环保和智能化需求的日益增强,企业必须在技术创新和数据管理上不断突破,以满足客户对高效、安全和智能出行的期待。在这一背景下,前晨汽车凭借其在新能源智能商用车领域的前瞻性布局和技术实力,成为行业中的佼佼者。前晨汽车采用整车数据采集和全车数据打通策略,能够实时将数据推送至APP端客户。然而,这导致整体写入和
为什么瘦子很难增胖?
我的狗毛毛
我是个标准的瘦子,168,100斤。用一句通俗的话来讲,我连马甲线都瘦出来了(体脂含量比较低)。但是我反而很羡慕那些比较丰满的女人,我的理想是再增重十五斤,练成前凸后翘的魔鬼身材。为此我开始纠正自己不规律的作息,吃高热量的食物,减少运动量,能坐着绝不站着,能躺着绝不坐着。但是结果却没有丝毫变化。我一直很苦恼,直到最近在网上看到一个视频,英国的某个研究机构做了一个实验,想要知道瘦子能否在高热量的食物
2.2.6 通知类控件 Toast、Menu
常思行
本文例程下载:WillFlow_Toast、WillFlowMenu一、什么是Toast?Toast也被叫做吐司,是Android系统提供的一种非常好的提醒方式,在程序中可以使用它将一些短小的信息通知给用户,它有如下两个特点:Toast是没有焦点的Toast显示的时间有限过一定的时间就会自动消失所以一般来讲Toast的使用并不会影响我们的正常操作,并且它通常不会占用太大的屏幕空间,有着良好的用户体
现代汉语粗糙版 文学史与经典
学习搬运工
第十六章文学史与经典文学史的兴起在西方,虽然从亚里士多德开始,在人类的著述中已经可以找到文学史概念与写作方式的萌芽,但是,人们一般认为17世纪后期到18世纪是现代文学史写作真正开始的时期。长达百年波及整个欧洲的“古今之争”孕育出文学研究的历史意识,现代意义上的文学史观念在这场影响深远的论争中初见端倪。从18世纪晚期到19世纪初,由于席勒、弗·施莱格尔和赫尔德等人的介入,文学史研究逐渐变得复杂和成熟
eclipse maven
IXHONG
eclipse
eclipse中使用maven插件的时候,运行run as maven build的时候报错
-Dmaven.multiModuleProjectDirectory system propery is not set. Check $M2_HOME environment variable and mvn script match.
可以设一个环境变量M2_HOME指
timer cancel方法的一个小实例
alleni123
多线程 timer
package com.lj.timer;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class MyTimer extends TimerTask
{
private int a;
private Timer timer;
pub
MySQL数据库在Linux下的安装
ducklsl
mysql
1.建好一个专门放置MySQL的目录
/mysql/db数据库目录
/mysql/data数据库数据文件目录
2.配置用户,添加专门的MySQL管理用户
>groupadd mysql ----添加用户组
>useradd -g mysql mysql ----在mysql用户组中添加一个mysql用户
3.配置,生成并安装MySQL
>cmake -D
spring------>>cvc-elt.1: Cannot find the declaration of element
Array_06
spring bean
将--------
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3
maven发布第三方jar的一些问题
cugfy
maven
maven中发布 第三方jar到nexus仓库使用的是 deploy:deploy-file命令
有许多参数,具体可查看
http://maven.apache.org/plugins/maven-deploy-plugin/deploy-file-mojo.html
以下是一个例子:
mvn deploy:deploy-file -DgroupId=xpp3
MYSQL下载及安装
357029540
mysql
好久没有去安装过MYSQL,今天自己在安装完MYSQL过后用navicat for mysql去厕测试链接的时候出现了10061的问题,因为的的MYSQL是最新版本为5.6.24,所以下载的文件夹里没有my.ini文件,所以在网上找了很多方法还是没有找到怎么解决问题,最后看到了一篇百度经验里有这个的介绍,按照其步骤也完成了安装,在这里给大家分享下这个链接的地址
ios TableView cell的布局
张亚雄
tableview
cell.imageView.image = [UIImage imageNamed:[imageArray objectAtIndex:[indexPath row]]];
CGSize itemSize = CGSizeMake(60, 50);
&nbs
Java编码转义
adminjun
java 编码转义
import java.io.UnsupportedEncodingException;
/**
* 转换字符串的编码
*/
public class ChangeCharset {
/** 7位ASCII字符,也叫作ISO646-US、Unicode字符集的基本拉丁块 */
public static final Strin
Tomcat 配置和spring
aijuans
spring
简介
Tomcat启动时,先找系统变量CATALINA_BASE,如果没有,则找CATALINA_HOME。然后找这个变量所指的目录下的conf文件夹,从中读取配置文件。最重要的配置文件:server.xml 。要配置tomcat,基本上了解server.xml,context.xml和web.xml。
Server.xml -- tomcat主
Java打印当前目录下的所有子目录和文件
ayaoxinchao
递归 File
其实这个没啥技术含量,大湿们不要操笑哦,只是做一个简单的记录,简单用了一下递归算法。
import java.io.File;
/**
* @author Perlin
* @date 2014-6-30
*/
public class PrintDirectory {
public static void printDirectory(File f
linux安装mysql出现libs报冲突解决
BigBird2012
linux
linux安装mysql出现libs报冲突解决
安装mysql出现
file /usr/share/mysql/ukrainian/errmsg.sys from install of MySQL-server-5.5.33-1.linux2.6.i386 conflicts with file from package mysql-libs-5.1.61-4.el6.i686
jedis连接池使用实例
bijian1013
redis jedis连接池 jedis
实例代码:
package com.bijian.study;
import java.util.ArrayList;
import java.util.List;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoo
关于朋友
bingyingao
朋友 兴趣爱好 维持
成为朋友的必要条件:
志相同,道不合,可以成为朋友。譬如马云、周星驰一个是商人,一个是影星,可谓道不同,但都很有梦想,都要在各自领域里做到最好,当他们遇到一起,互相欣赏,可以畅谈两个小时。
志不同,道相合,也可以成为朋友。譬如有时候看到两个一个成绩很好每次考试争做第一,一个成绩很差的同学是好朋友。他们志向不相同,但他
【Spark七十九】Spark RDD API一
bit1129
spark
aggregate
package spark.examples.rddapi
import org.apache.spark.{SparkConf, SparkContext}
//测试RDD的aggregate方法
object AggregateTest {
def main(args: Array[String]) {
val conf = new Spar
ktap 0.1 released
bookjovi
kernel tracing
Dear,
I'm pleased to announce that ktap release v0.1, this is the first official
release of ktap project, it is expected that this release is not fully
functional or very stable and we welcome bu
能保存Properties文件注释的Properties工具类
BrokenDreams
properties
今天遇到一个小需求:由于java.util.Properties读取属性文件时会忽略注释,当写回去的时候,注释都没了。恰好一个项目中的配置文件会在部署后被某个Java程序修改一下,但修改了之后注释全没了,可能会给以后的参数调整带来困难。所以要解决这个问题。
&nb
读《研磨设计模式》-代码笔记-外观模式-Facade
bylijinnan
java 设计模式
声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移步 原作者的博客http://chjavach.iteye.com/
/*
* 百度百科的定义:
* Facade(外观)模式为子系统中的各类(或结构与方法)提供一个简明一致的界面,
* 隐藏子系统的复杂性,使子系统更加容易使用。他是为子系统中的一组接口所提供的一个一致的界面
*
* 可简单地
After Effects教程收集
cherishLC
After Effects
1、中文入门
http://study.163.com/course/courseMain.htm?courseId=730009
2、videocopilot英文入门教程(中文字幕)
http://www.youku.com/playlist_show/id_17893193.html
英文原址:
http://www.videocopilot.net/basic/
素
Linux Apache 安装过程
crabdave
apache
Linux Apache 安装过程
下载新版本:
apr-1.4.2.tar.gz(下载网站:http://apr.apache.org/download.cgi)
apr-util-1.3.9.tar.gz(下载网站:http://apr.apache.org/download.cgi)
httpd-2.2.15.tar.gz(下载网站:http://httpd.apac
Shell学习 之 变量赋值和引用
daizj
shell 变量引用 赋值
本文转自:http://www.cnblogs.com/papam/articles/1548679.html
Shell编程中,使用变量无需事先声明,同时变量名的命名须遵循如下规则:
首个字符必须为字母(a-z,A-Z)
中间不能有空格,可以使用下划线(_)
不能使用标点符号
不能使用bash里的关键字(可用help命令查看保留关键字)
需要给变量赋值时,可以这么写:
Java SE 第一讲(Java SE入门、JDK的下载与安装、第一个Java程序、Java程序的编译与执行)
dcj3sjt126com
java jdk
Java SE 第一讲:
Java SE:Java Standard Edition
Java ME: Java Mobile Edition
Java EE:Java Enterprise Edition
Java是由Sun公司推出的(今年初被Oracle公司收购)。
收购价格:74亿美金
J2SE、J2ME、J2EE
JDK:Java Development
YII给用户登录加上验证码
dcj3sjt126com
yii
1、在SiteController中添加如下代码:
/**
* Declares class-based actions.
*/
public function actions() {
return array(
// captcha action renders the CAPTCHA image displ
Lucene使用说明
dyy_gusi
Lucene search 分词器
Lucene使用说明
1、lucene简介
1.1、什么是lucene
Lucene是一个全文搜索框架,而不是应用产品。因此它并不像baidu或者googleDesktop那种拿来就能用,它只是提供了一种工具让你能实现这些产品和功能。
1.2、lucene能做什么
要回答这个问题,先要了解lucene的本质。实际
学习编程并不难,做到以下几点即可!
gcq511120594
数据结构 编程 算法
不论你是想自己设计游戏,还是开发iPhone或安卓手机上的应用,还是仅仅为了娱乐,学习编程语言都是一条必经之路。编程语言种类繁多,用途各 异,然而一旦掌握其中之一,其他的也就迎刃而解。作为初学者,你可能要先从Java或HTML开始学,一旦掌握了一门编程语言,你就发挥无穷的想象,开发 各种神奇的软件啦。
1、确定目标
学习编程语言既充满乐趣,又充满挑战。有些花费多年时间学习一门编程语言的大学生到
Java面试十问之三:Java与C++内存回收机制的差别
HNUlanwei
java C++ finalize() 堆栈 内存回收
大家知道, Java 除了那 8 种基本类型以外,其他都是对象类型(又称为引用类型)的数据。 JVM 会把程序创建的对象存放在堆空间中,那什么又是堆空间呢?其实,堆( Heap)是一个运行时的数据存储区,从它可以分配大小各异的空间。一般,运行时的数据存储区有堆( Heap)和堆栈( Stack),所以要先看它们里面可以分配哪些类型的对象实体,然后才知道如何均衡使用这两种存储区。一般来说,栈中存放的
第二章 Nginx+Lua开发入门
jinnianshilongnian
nginx lua
Nginx入门
本文目的是学习Nginx+Lua开发,对于Nginx基本知识可以参考如下文章:
nginx启动、关闭、重启
http://www.cnblogs.com/derekchen/archive/2011/02/17/1957209.html
agentzh 的 Nginx 教程
http://openresty.org/download/agentzh-nginx-tutor
MongoDB windows安装 基本命令
liyonghui160com
windows安装
安装目录:
D:\MongoDB\
新建目录
D:\MongoDB\data\db
4.启动进城:
cd D:\MongoDB\bin
mongod -dbpath D:\MongoDB\data\db
&n
Linux下通过源码编译安装程序
pda158
linux
一、程序的组成部分 Linux下程序大都是由以下几部分组成: 二进制文件:也就是可以运行的程序文件 库文件:就是通常我们见到的lib目录下的文件 配置文件:这个不必多说,都知道 帮助文档:通常是我们在linux下用man命令查看的命令的文档
二、linux下程序的存放目录 linux程序的存放目录大致有三个地方: /etc, /b
WEB开发编程的职业生涯4个阶段
shw3588
编程 Web 工作 生活
觉得自己什么都会
2007年从学校毕业,凭借自己原创的ASP毕业设计,以为自己很厉害似的,信心满满去东莞找工作,找面试成功率确实很高,只是工资不高,但依旧无法磨灭那过分的自信,那时候什么考勤系统、什么OA系统、什么ERP,什么都觉得有信心,这样的生涯大概持续了约一年。
根本不是自己想的那样
2008年开始接触很多工作相关的东西,发现太多东西自己根本不会,都需要去学,不管是asp还是js,
遭遇jsonp同域下变作post请求的坑
vb2005xu
jsonp 同域post
今天迁移一个站点时遇到一个坑爹问题,同一个jsonp接口在跨域时都能调用成功,但是在同域下调用虽然成功,但是数据却有问题. 此处贴出我的后端代码片段
$mi_id = htmlspecialchars(trim($_GET['mi_id ']));
$mi_cv = htmlspecialchars(trim($_GET['mi_cv ']));
贴出我前端代码片段:
$.aj