【问题标题】:CSS selection using Mojo::DOM使用 Mojo::DOM 进行 CSS 选择
【发布时间】:2018-03-30 17:09:37
【问题描述】:

这是一个多学科的问题,所以答案可能不是纯粹的 CSS。

我正在解析一个大表,我的目标是仅检索 <b></b> 标记之外的文本。我能够选择行,但坚持如何只选择粗体标记之外的文本。

HTML

<div id="tab1">
<table width='650' class='subtblfont'>
    <tr><td>&nbsp;</td></tr> 
    <tr><td>&nbsp;</td></tr>        
    <tr>
        <td><b>Check-in Date:&nbsp;</b>04/20/2013</td>
        <td><b>Check-in Date:&nbsp;</b>04/25/2013</td>
    </tr>
</table>

代码

$row_content = $results_dom->find('div#tabs-1 tr:nth-child(3) td');

foreach (@$row_content) {
    print "$_\n";
}

输出

<td><b>Check-in Date:&nbsp;</b>04/20/2013</td>
<td><b>Check-in Date:&nbsp;</b>04/25/2013</td>

期望的输出

04/20/2013
04/25/2013

我可以使用正则表达式来提取文本,但这不是一个理想的解决方案。有没有办法只选择非粗体文本?

【问题讨论】:

  • 策略:遍历&lt;td&gt;的所有子节点。过滤掉所有 &lt;b&gt; 元素。从其余部分中提取文本。但似乎您不想摆脱粗体文本,而是找到一个日期。提取所有文本,然后将正则表达式应用于纯文本可能更明智,如果这是您的目标。
  • “我可以使用正则表达式来提取文本,但这不是一个理想的解决方案” 我想知道为什么不呢?似乎您想从 &lt;tr&gt; 元素中提取日期,并且依赖于文本的那部分不加粗是一种奇怪的方法。粗体标签是文体而非语义,而mm/dd/yyyy 日期序列很容易从文本中精确提取。
  • @Boro 所有 元素都不包含日期。有数百个元素,其中一些具有非常复杂的格式。
  • @amon 澄清一下,我确实想要使用粗体文本。我不确定如何使用 CSS 选择器(或 Mojo 的 CSS 选择器版本)过滤掉所有 元素。
  • @Notamachine: “或者 Mojo 的 CSS 选择器版本” 据我所知,Mojo::DOM::CSS 是 CSS3 的一个非常完整的实现。

标签: html css perl mojo-dom


【解决方案1】:

来自Documentation

文字

仅从该元素中提取文本内容(不包括子元素 元素)。

尝试一下:

(虽然我不太了解 perl,所以如果我的语法有误……抱歉)

$row_content = $results_dom->find('div#tabs-1 tr:nth-child(3) td')->each(sub { say $_->text})

【讨论】:

  • 谢谢你。我试过 ->text 但显然没有正确包装它。
  • 最简洁的方法是使用map在每个匹配的元素上调用text方法,each不带参数将集合转换为普通列表。 my @vals = $results_dom-&gt;find('...')-&gt;map('text')-&gt;each 将保留包含所需文本字符串的数组。
  • 顺便说一下,如果第三行始终是表中的最后一行,您可能更喜欢使用tr:last-child 代替tr:nth-child(3)
猜你喜欢
相关资源
最近更新 更多
热门标签