2013-05-13 121 views
2

我需要提取HTML文档正文中的所有粗体代码片段。我需要使用Java(不在浏览器上)在服务器端执行此操作。如何仅从HTML文档中提取粗体文本?

页面上的文本可以因标签等而变为粗体。 <b>,<h1>等,或者因为内联CSS样式style="font-weight:bold;",或者因为使用CSS类别的外部CSS样式。

我正在使用Jsoup,但我也可以使用任何其他库来完成此操作。

谢谢你的时间!

+1

该页面是否具有已定义的结构,还是可以变化?如果可能,请发布示例HTML页面。 – Greg 2013-05-13 09:54:53

+1

为什么添加javascript标签? Java会更合适不行? – MisterJ 2013-05-13 09:56:02

+0

如果你想在“服务器端”做到这一点,你应该把问题标记为“java”。 Jukka K. Korpela花了一段时间为您提供了一个极好的高质量解决方案,同时您接受了一个有缺陷且价格便宜的解决方案,编辑您的问题和标签以便“适合”解决方案。 – 2013-05-13 10:42:27

回答

1

对于标签和内联样式(例如样式直接添加到HTML中,不包含在外部CSS样式表中),您可以使用css选择器link。 (对于内联样式,它将是[style*="font-weight:bold;"])。

+1

那么通过外部样式表粗体文本呢? – 2013-05-13 10:25:31

+0

海事组织是不可能与jsoup。然后他必须找到另一个库或写下一个css解析器。 Op没有具体说明他是否需要处理外部CSS样式表,因此我给了他一个解决方案,说明它可以做什么。 – MisterJ 2013-05-13 11:33:17

2

一个普通的JavaScript解决方案:在足够新的浏览器上,可以使用getPropertyValue方法来检索元素的计算样式。您可以遍历文档树并检查所有文本节点;文本节点别有风情,所以你需要检查他们的父母:

function consume(string) { 
    console.log(string); 
} 
function traverse(tree) { 
    var i; 
    if(tree.nodeType === 3) { 
    if(getComputedStyle(tree.parentNode).getPropertyValue('font-weight') === 'bold') { 
     consume(tree.textContent); 
    } 
    } 
    for(i = 0; i < tree.childNodes.length; i++) { 
    traverse(tree.childNodes[i]); 
    } 
} 
traverse(document.body); 

通过自己的函数,处理大胆的文本替换consume

即使声明为700,似乎font-weight的计算值也是bold

请注意,这只会选取字体粗细设置为粗体(700)的文本。计算字体重量为600,800或900的元素很可能会以粗体显示(当然取决于字体的可用性)。可以通过对测试进行明显修改来覆盖它们。

+0

太好了。你是否也有Java中服务器端的解决方案? – 2013-05-13 10:43:19