- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当 HTML 表格没有 <thead>
时,我想检测该表格的 header 元素。 (MediaWiki,它驱动维基百科,does not support <thead>
elements。)我想在 BeautifulSoup 和 lxml 中使用 python 来完成此操作。假设我已经有一个 table
对象,我想摆脱它 thead
对象,一个tbody
对象,以及 tfoot
对象。
目前,parse_thead
当 <thead>
时执行以下操作标签存在:
doc.find_all('table')
获取表对象我可以使用table.find_all('thead')
doc.xpath()
获取表对象在 //table
上的 xpath_expr 上,我可以使用table.xpath('.//thead')
和parse_tbody
和parse_tfoot
以同样的方式工作。 (我没有写这段代码,而且我对 BS 或 lxml 都没有经验。)但是,没有 <thead>
, parse_thead
不返回任何内容并且 parse_tbody
一起返回 header 和正文。
我附加一个wikitable instance以下为例。它缺少<thead>
和<tbody>
。相反,所有行(无论是否有标题)都包含在 <tr>...</tr>
中。 ,但标题行有 <th>
元素和主体行有 <td>
元素。没有<thead>
,似乎识别标题的正确标准是“从一开始,将行放入标题中,直到找到包含不是 <th>
的元素的行”。
我很感激有关如何写作 parse_thead
的建议和parse_tbody
。如果没有太多经验,我想我可以
thead
和tbody
在解析它之前添加标签(这看起来不错,因为这样我就不必更改任何其他识别带有 <thead>
的表的代码),或者parse_thead
和parse_tbody
识别仅包含 <th>
的表行元素。 (无论哪种选择,似乎我确实需要以这种方式检测头体边界。)我不知道如何做这两件事,我很乐意就哪种选择更明智以及我如何去做提供建议。
(编辑:使用 no header rows 和 multiple header rows 的示例。我不能假设它只有一个标题行。)
<table class="wikitable">
<tr>
<th>Rank</th>
<th>Score</th>
<th>Overs</th>
<th><b>Ext</b></th>
<th>b</th>
<th>lb</th>
<th>w</th>
<th>nb</th>
<th>Opposition</th>
<th>Ground</th>
<th>Match Date</th>
</tr>
<tr>
<td>1</td>
<td>437</td>
<td>136.0</td>
<td><b>64</b></td>
<td>18</td>
<td>11</td>
<td>1</td>
<td>34</td>
<td>v West Indies</td>
<td>Manchester</td>
<td>27 Jul 1995</td>
</tr>
</table>
最佳答案
使用 XPath 执行此操作 W3C MDN 希望更加通用。请注意,不包含命名空间,这可能是必需的,具体取决于您的环境。此答案已通过 this xpath tester 验证链接自 MDN。
* 对于下面的内容,假设 XPath 相对于表,即您正在 <table>
上调用 xpath 函数元素,因此 .
是 <table>
;或者你可以在前面加上 //table//
到路径。
以下内容是在Python中使用lxml[1],因为这就是问题中提到的内容。 parse_thead
返回<tr>
所提供节点的子元素,并且仅具有 <th>
细胞。 parse_tbody
返回<tr>
至少有一个 <td>
的元素单元格:
_TR_HEADER = './/tr[count(th)=count(th|td)]'
_TR_BODY = './/tr[count(th)<count(th|td)]'
def parse_thead(table):
return table.xpath(_TR_HEADER)
def parse_tbody(table):
return table.xpath(_TR_BODY)
默认查找 <thead>
应该相对简单。和<tbody>
在采用此策略之前要考虑的因素。
处理格式错误的 HTML 表比较困难,如果您仅限于 XPath 1.0,则可能需要一些预处理和后处理。
选择“标题”表行( <tr>
元素),其中所有子项均为 <th>
元素:
_TR_HEADER = '//tr[count(th)=count(*)'
选择“正文”表行,其中至少有一个子项不是 <th>
:
_TR_BODY = '//tr[count(th)<count(*)'
仅在没有 <td>
的情况下选择行作为标题细胞:
_TR_HEADER = '//tr[count(td)=0]'
如果没有行满足要求,则始终选择第一行作为标题[2]:
_TR_HEADER = '//tr[..[count(tr[count(th)=count(*)])=0] and position()=1 or count(th)=count(*)]'
始终选择 <thead>
中出现的行标记除了满足要求的行:
_TR_HEADER = '//tr[count(th)=count(*) or ..[name()="thead"]]
选择最多包含一个 <th>
的行作为正文以及至少一个<td>
:
_TR_BODY = '//tr[count(th)<2 and count(td)>1]
如果没有标题,或者它们出现在标题后面,则选择行作为正文[2]:
_TR_BODY = '//tr[..[count(tr[count(th)=count(*)])=0] or preceding-sibling::tr[count(th)=count(*)] and count(th)<count(*)]'
如果行遵循问题中定义的最后一个标题行,则选择行作为正文:
_TR_BODY = '//tr[count(th)=count(th|td)][last()]/following-sibling::tr
<th>
标题行中的单元格,并且至少有一个 <td>
在正文行中。<table>
或者前置路径可能会有所帮助,就像指定中间节点如 <tbody>
一样。而不是使用//
.row-span
和col-span
属性,尽管这可以通过对所选元素进行后处理来完成。[1] 请注意,这可能需要提供 namespace="http://www.w3.org/1999/xhtml"
作为 {node}.xpath
的命名参数调用,我认为取决于您使用的解析器。
[2] 请注意,这很困惑,因为没有 sibling-or-self
值得信赖,因此 ..[count(...)]
。我将答案限制为 XPath 1.0,因为 XPath 2.0 及更高版本的功能并不总是受支持。另外使用parent
打破的情况下有一个 <thead>
包装。如果原始路径没有返回节点,则运行替代选择将是一个很好的解决方案。
关于python - 当表格缺少 thead 元素时,使用 beautifulsoup/lxml 检测 HTML 表格中的 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45292001/
我正在研究 Bootstrap 4 中的表格。我不知道为什么不应用台灯类中的背景颜色。这是因为台灯无法覆盖暗灯吗?如果是真的,你能告诉我是什么让 thead-dark 优先于此吗?如果不是我想的,请为
我有两种情况,使用和不使用 的 HTML 脚本显示不同。标签。 场景 1:(带有 标签) HTML PAGE
谁能告诉我 while(thead != NULL) 和 while(thead->next !=NULL) 之间的区别是什么,因为遍历列表 thead != NULL 不工作,而 thead->ne
我有以下问题:我的 table 有大头(3 行)。我想修复thead 和tbody 滚动。我用jquery 但是当我向下滚动时,边框消失了。 $(document).ready(function()
我已将以下 CSS 应用于我的表格。 thead, tbody { display: block; } tbody { height: 200px; overflo
这个问题在这里已经有了答案: How to set tbody height with overflow scroll (16 个答案) 关闭 5 年前。
我希望我的表格具有固定的 thead 和可滚动的 tbody。我对其应用了以下 CSS: thead, tbody { display: block; } tbody { height:
我想使用 Christian Bach's tableSorter client-side table sorting jQuery plugin使用我的 asp.Net GridView 控件。 但
我正在开发一个 react - rails 应用程序,但我的控制台中一直出现此错误: ``` Warning: validateDOMNesting(...): cannot appear as a
好的,长篇短篇小说。我有一个结构如下的表: longer Heading with a width of 100% cell 1cell 2 cell 3cell 4 而且我希望 th 是
我正在使用Datatables对我拥有的数据表进行排序/过滤。我希望能够在标题中对两者进行排序和过滤,但是,单击过滤器会使表排序,然后过滤器选择不会保持打开状态。 我这里有一个演示:http://co
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求提供代码的问题必须表现出对所解决问题的最低限度的了解。包括尝试的解决方案、为什么它们不起作用以及预期结果
是否可以使用 javascript 将第一行移动到 中?标签? Server Name Network Zone Operational
我有一些 JavaScript 可以将点击的第 th 个元素的类切换为“升序”或“降序”。 问:在 css 中,如何显示与 .ascending 或 .descending 关联的 jQuery-UI
所以我能够创建一个粘性标题表并且它工作正常。问题是我需要制作另一个带有多行标题的表格,而我目前使用的方法不起作用,正如您在下面的代码中看到的那样。 .table-wrapper { positio
几乎有了 - 用动态数据描绘一个表格 - 这可以右对齐表格中的日期和数字列但更重要的是我还想右对齐相应 中的标签列柱子。如果我了解幕后情况,下面的这个方法一次一行,如果有匹配,它适用 text-al
我有以下内容: Document Date Buy-from Vendor No.
使用 thead 而不是仅仅使用 td 有什么好处?如果有好处... 最佳答案 HTML 中的 thead、tbody 和 tfoot 元素用于根据内容将表行分组到逻辑部分。您这样做的主要原因有两个:
我有一个数组: let headers = [ { title: 'First Name', style: 'bold' }, { title: 'Last Name', style:
我目前正在尝试编写一个实现以下功能的函数: 按随机顺序从“消息”列表中获取所有消息,同时确保没有重复的消息。 在延迟 1 - 10 秒范围内的随机秒数后打印它们。 所有线程完成后,打印字符串“打印完成
我是一名优秀的程序员,十分优秀!