2010-06-01 86 views
7

好吧我很茫然如何命名这个问题。我有一些HTML文件,可能是由Lucide上尉自己写的,我需要解析。它由很多这样的片段,其他html标签中解析HTML“视觉”

<p>HeadingNumber</p> 
<p style="text-indent:number;margin-top:neg_num ">Heading Text</p> 
<p>Body</p> 

注意,标题编号和文字都在单独的p标签,在通过CSS水平线上。 css可能是Lucify的幻想,缩进,填充,边距和位置的混合。

但是,该行是我业务模型中的单个对象,应该保持这样。那么如何检测两个p元素是否在一行中可视化并相应地处理它们。如果有帮助,我相信HTML文件格式良好。

+3

听起来像一个“网络浏览器”的工作:) – 2010-06-01 21:09:58

+1

你使用什么语言? PHP的? java吗? ... – laher 2010-06-01 21:10:10

+3

@这个问题:hahahahahahahaha。我真的为你和这个要求感到难过。对不起的人:\ – Jason 2010-06-01 21:13:26

回答

2

你没有指定你是如何解析的,但这在jQuery中是可能的,因为你可以确定窗口原点中任何元素的偏移位置。 Check out the example here.

代码:

$(function() { 

function sameHorizon(obj1, obj2, tolerance) { 

    var tolerance = tolerance || 0; 

    var obj1top = obj1.offset().top; 
    var obj2top = obj2.offset().top; 

    return (Math.abs(obj1top - obj2top) <= tolerance); 

} 

$('p').each(function(i,obj) { 
    if ($(obj).css('margin-top').replace('px','') < 0) { 
     var p1 = $(obj).prev('p'); 
     var p2 = $(obj); 
     var pTol = 4; // pixel tolerance within which elements considered aligned 

     if (sameHorizon(p1, p2, pTol)) { 
      // put what you want to do with these objects here 
      // I just highlighted them for example 
      p1.css('background','#cc0'); 
      p2.css('background','#c0c'); 

      // but you can manipulate their contents 
      console.log(p1.html(), p2.html()); 
     } 
    } 
}); 

​}); 

这个代码是基于一个假设,如果一个<p>具有负margin-top然后尝试与以前<p>排列,但如果你知道的jQuery应该显然如何改变它以符合不同的标准。

如果你不能为你的问题使用jQuery,那么希望这对其他谁是或者你可以在jQuery中设置一些东西来解析这个并输出新的标记是有用的。

0

你可能会碰到irobotsoft网站刮板和有一个测试:

  • 打开在其浏览器窗口
  • 选择的页面和标记线
  • 使用菜单:设计 - >实践HTQL看看如果它可以提取该行。
0

我没有很多使用它的经验,但是如果HTML格式良好,并且取决于需要解析数据的格式,则可以将其视为XML文档并使用XQuery解析出你的数据。

同时在Firefox中打开HTML并查看是否可以弄清楚使用Firebug应用了哪些CSS样式。它可能会给你一个更好的线索,看看HTML是如何排列起来的......虽然它看起来像使用'margin-top:negative_number'来完成......如果是这种情况,我认为XQuery应该能够找到应用了该特定样式的元素。

+0

如果你认为XQuery可能会有所帮助,你可以使用它在.NET中以及... http://www.4guysfromrolla.com/articles/071603 -1.2.aspx – 2010-06-03 03:55:31