- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我需要解析包含 colspans 和 rowspans 的 HTML 表并构建它的表示。
读取 HTML 不是问题,我正在使用 HTMLCleaner 和 XQuery with Saxon (Java)。
但我正在寻找一个好的算法来构建表格,因为我不理解浏览器在“困难”情况下遵循的规则。
例如,给定下表(其中rowspan是错误的)
<table border=1>
<tr><td rowspan="3">1</td><td>2</td></tr>
<tr><td>3</td></tr>
</table>
我应用以下算法:
1) for each tr
1.1) expand the colspan and rowspan of the cells in the current line
1.2) create a new line if it doesn't already exist
1.3) for each td add the elements to the line
即(E是一个空单元格)
newline->no line existing==no expansion
add line elements (1.3)
line1: 1 [tr=3], 2
newline->tr expansion (1.1)
line1: 1[tr=3], 2
line2: E
line3: E
add line elements (1.3)
line1: 1[tr=3], 2
line2: E, 3
line3: E
必须删除第 3 行(Firefox 只呈现两行),我怎么知道?
我对不完整行的元素由以下行的元素完成的情况特别感兴趣,例如:
<tr><td>1</td><td>2</td><td>3</td></tr>
<tr><td>4</td><td>5</td></tr>
<tr><td>6</td></tr>
rendering: 1 2 3
4 5 6
我有一个实际案例:this file包含两个 TR,即使它们是两个不同的 TR,它们也呈现为一个。为什么?
它们呈现为(在红色矩形内)
我如何决定将元素排到前一行?
对于奇怪的代码,浏览器遵循什么规则?
我使用的是 Java,我也懂 javascript 和一点 PHP,但我我主要对算法感兴趣。我想知道是否已经存在或听取任何建议。
我想要的是能够像真实浏览器呈现的那样输出表格的文本表示。
编辑:
阅读 xtratic 答案后,我阅读了 HTML table processing model specification ,但它似乎没有回答我关于何时必须将元素排入上一行的问题,正如我描述的实际情况(并在此编辑中添加)。事实上,文档说“16 如果当前单元格是正在处理的 tr 元素中的最后一个 td 或 th 元素子元素,则将 ycurrent 增加 1,中止这组步骤,并返回到上面的算法。”。但并非总是会在找到最后一个 td 时换行。
我更感兴趣的是何时组合不同的行。当上一行的 TD 数量少于已找到的最大值时,我尝试将 TD 排在上一行之后,但它不起作用
最佳答案
阅读 HTML table processing model specification 以了解您需要了解的有关如何处理 HTML 表格的所有信息。 (不容易)
由于您要解析 html 表格的形式,我建议您完全按照 §4.9.12.1 Forming a table 下列出的步骤编写您的处理器。 (第 18 步开始处理行)。我很确定浏览器也是这样做的。这些步骤的编写方式尽可能方便地转换为处理器的代码,因此您应该能够完全按照字面意思进行操作。一旦你的处理器完成,你应该有一个单元格表(正如它所定义的那样),然后你可以用你现在拥有的表模型做任何你想做的事情。我不能保证这会很容易,但至少你会有一步一步的指导。
要特别清楚:没有“组合行”,但存在跨越多行的单元格。
algorithm for growing downward是什么放GENERALI SPA..
在所有这些行的开头,以及来自以下 <tr>
的数据元素被添加到它们各自行的下一个可用单元格中。
GENERALI SPA...
跨越 4 行,但它的第一行是隐藏的,因为上面没有其他数据,所以看起来它只包含 3 行。
<tr> <!-- row 1 (0px high) -->
<!-- td spans from [1,1] to [1,4] -->
<!-- this fills the first column of rows 1, 2, 3, and 4 -->
<td rowspan="4">GENERALI SPA #1</td>
</tr>
<tr> <!-- row 2 -->
<!-- col 1 is taken by the cell defined above -->
<!-- td spans from [2,2] to [2,3] taking up col 2 of row 2 and 3 -->
<td rowspan="2">GENERALI SPA #2</td>
<td>Proprieta'</td> <!-- ... -->
</tr>
<tr> <!-- row 3 -->
<!-- col 1 and 2 are taken by the cells defined above -->
<td rowspan="1">Totale #1</td> <!-- ... -->
</tr>
<tr> <!-- row 4 -->
<!-- col 1 is taken by the cell defined above -->
<td colspan="2">Totale #2</td> <!-- ... -->
</tr>
没有格式化或隐藏的表格看起来像这样:
1 2 3 4
+----------------------+---------------------+-------------+---
1 | ... | (implied) (implied) <-- 0px high (hidden)
+- -+---------------------+-------------+---
2 | "GENERALI SPA #1" | "GENERALI SPA #2" | "Proprieta" | ..
+- -+- -+-------------+---
3 | ... | ... | "Totale #1" | ..
+- -+---------------------+-------------+---
4 | ... | "Totale #2" ... | ..
+----------------------+---------------------+-------------+---
这实际上是您按照 html 规范中的流程解析后获得的表模型。
我认为删除“不完整”行(定义不完整)没有多大意义,让它们留在表格中,它们本质上是标题行,位于它们包含的更多数据之前,它们并没有真正伤害任何东西,您可以很容易地检测到它们。
但是,如果您真的想要,则可以删除没有明确创建的单元格的行,除了跨越其他行的单元格。对于上面的表格部分,您可以删除第 1 行,因为第 1 列跨越第 1、2、3 和 4 行,并且第 1 行没有其他明确创建的单元格。因此,第 1 行的所有数据仍然存在于数据跨度 ([[1,2]、[1,3]、[1,4]) 的单元格中,您可以安全地删除第 1 行。
作为一个额外的例子,当我改变 rowspan
到 1,此数据出现在其自己的行和以下 <tr>
数据填充各自行上的可用单元格:
vvv 不太相关的信息 vvv
老HTML 4.01 Specification ,有一个与您的问题相关的直接示例:
The next example illustrates (with the help of table borders) how cell definitions that span more than one row or column affect the definition of later cells. Consider the following table definition:
<TABLE border="1">
<TR><TD>1 <TD rowspan="2">2 <TD>3
<TR><TD>4 <TD>6
<TR><TD>7 <TD>8 <TD>9
</TABLE>
As cell "2" spans the first and second rows, the definition of the second row will take it into account. Thus, the second TD in row two actually defines the row's third cell. Visually, the table might be rendered to a tty device as:
-------------
| 1 | 2 | 3 |
----| |----
| 4 | | 6 |
----|---|----
| 7 | 8 | 9 |
-------------
Note that if the TD defining cell "6" had been omitted, an extra empty cell would have been added by the user agent to complete the row.
这related question and answer列出了一些可以帮助您抓取表格的库,但我不相信这个答案会处理“困难”的情况,因为它假设 <td>
的出现。元素与其在表中的单元格索引完全对应。
关于java - 构建 HTML 表格表示的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49845905/
Byte byte1=10; Short short1=20; Integer integer=30; 在上面的代码中自动装箱成功在这里查看下面的代码,我正在明确地进行 casitng,因为它默认将
这里有几个相关的问题。 根据标题,如果我们将变量类型指定为 long 或 float、double,为什么它是一个要求?编译器不会在编译时评估变量的类型吗? Java 将所有整型文字视为 int -
我最近一直在使用一些 bash 脚本,并且一直在浏览手册页。根据我收集到的信息,$(( )) 是否表示 expr 而 [ ] 是否表示 test? 对于 $(( )): echo $(( 5 + 3
我有 UILabel,其中显示了 int 值,我希望如果值以千为单位,例如 1000,那么标签应该在 2000 年及以后显示 1k 和 2k。如何实现? 最佳答案 这个怎么样? int myNum =
我正在自学 verilog 并尝试编写失败模型。我在指定部分遇到了以下 ck->q 延迟弧的建模,但无法理解它到底是做什么的。 (posege CK => (Q : 1'b1))=(0, 0); 谁能
考虑这样一个句子: John Smith travelled to Washington. 在美好的一天,名称标记者会将“约翰·史密斯”识别为一个人,将“华盛顿”识别为一个地方。然而,如果没有其他证据
有没有办法通过某种元处理器或预处理器告诉 JavaScript 单词 AND 等于 && 而单词 OR 等于 ||和 <> 等同于 !===? 也许将 THEN 等同于 { 结束到 不要! 最佳答案
我正在处理一个非常大的图,它有 5 亿个节点,节点的平均度为 100。所以它是一种稀疏图。我还必须存储每条边的权重。我目前正在使用两个 vector ,如下所示 // V could be 100 m
我想使用 Python 表示一组整数范围,其中可以动态修改该集合并测试其是否包含在内。具体来说,我想将其应用于文件中的地址范围或行号。 我可以定义我关心的地址范围: 200 - 400 450 -
>>> x = -4 >>> print("{} {:b}".format(x, x)) -4 -100 >>> mask = 0xFFFFFFFF >>> print("{} {:b}".forma
虽然代码不多,但简单明了 复制代码 代码如下: preg_match('/^(?!string)/', 'aa') === true 这个用来验证一个字符串是否是非'string'开头的,
我正在尝试创建一些 SQLAlchemy 模型,并且正在努力解决如何将 timedelta 正确应用于特定列的问题。 timedelta(以天为单位指定)作为整数存储在单独的表 (Shifts) 中,
“Range: bytes=0-” header 是什么意思?是整个文件吗?我尝试发回 0 个字节但没有成功,当我发送整个文件时它可以正常工作,但我在流式上下文中不止一次收到此请求,它看起来不正确。
要创建时间序列的 SAX 表示,您首先需要计算数据的 PAA(分段聚合近似),然后将答案映射到符号表。但是,在计算 PAA 之前,您需要对数据进行标准化。 我正在对数据进行标准化,但我不知道之后如何计
假设我有一个 RESTful、超文本驱动的服务来模拟冰淇淋店。为了帮助更好地管理我的商店,我希望能够显示每日报告,列出所售每种冰淇淋的数量和美元值(value)。 这种报告功能似乎可以作为名为 Dai
我需要以 RDF 格式表示句子。 换句话说,“约翰喜欢可乐”将自动表示为: Subject : John Predicate : Likes Object : Coke 有谁知道我应该从哪里开始?是否
我即将编写一个解析器,将文本文件逐行读取到不同类型的结构中,并将这些结构提供给回调(观察者或访问者 - 尚不确定)。 文本文件包含 MT-940 数据 - SWIFT 银行对帐单。 这些行由一个指定类
我主要是一名 C++ 开发人员,但我经常编写 Python 脚本。我目前正在为游戏编写骰子模拟器,但我不确定在 Python 中解决我的问题的最佳方法。 一共有三种玩家技能,每个玩家一强、中一、弱一。
在过去的 5 个小时里,我一直在寻找答案。尽管我找到了很多答案,但它们并没有以任何方式提供帮助。 我基本上要寻找的是任何 32 位无符号整数的按位异或运算符的数学、算术唯一表示。 尽管这听起来很简单,
我需要将依赖项存储在 DAG 中。 (我们正在细粒度地规划新的学校类(class)) 我们正在使用 rails 3 注意事项 宽于深 很大 我估计每个节点有 5-10 个链接。随着系统的增长,这将增加
我是一名优秀的程序员,十分优秀!