背景
许多问题都在询问如何根据CSS选择器获取特定的DOM元素。而这个问题则是相反的方向。一个文档使用jsoup进行解析,但可以轻松转换为以下任意一种:
应用场景
对于某些特定的问题领域(例如化合物),成千上万个网页以类似的方式列出了化学物质,但标记在不同的网站上有所不同。例如:
<div id="chemical-list">
<div class="compound">
<span class="compound-name">water</span>
<span class="compound-periodic">H2O</span>
</div>
<div class="compound">
<span class="compound-name">sodium hypochlorite</span>
<span class="compound-periodic">NaClO</span>
</div>
</div>
另一个网站可能会以不同的方式列出它们:
<ul class="chemical-compound">
<li class="chem-name">water, H2O</li>
<li class="chem-name">sodium hypochlorite, NaClO</li>
</ul>
另一个网站可能会使用不同的标记:
<table border="0" cellpadding="0" cellspacing="0">
<tbody>
<tr><td>water</td><td>H2O</td></tr>
<tr><td>sodium hypochlorite</td><td>NaClO</td></tr>
</tbody>
</table>
从成千上万个网站中下载一些样本页面。然后,使用现有的化学品清单,可以相对简单地检索候选网络页面元素列表。使用jsoup,这就像这样简单:
Elements elements = chemicals.getElementsMatchingOwnText( chemicalNames );
这将允许对数千个页面进行高精度分析。(页面可以讨论水和次氯酸钠的应用,但只有列表正在被分析。)了解CSS将极大地简化分析并提高准确性。
另一种选择是处理整个页面寻找化学品“组”,然后尝试提取列表。两个问题都很困难,但使用CSS选择器跳转到页面上的准确位置要更高效,也更可能更准确。两个问题都需要手工制作,但我想尽可能地自动化。
问题
所述的API似乎没有生成给定元素实例(越独特越好)的CSS选择器的方法。可以通过迭代父元素并手动生成选择器来实现。这已经在一些问题中使用JavaScript进行了演示。还有关于生成XPath的答案,可能也可以使用Selenium。具体来说,您如何做类似以下的事情:
String selector = element.getCSSPath();
Elements elements = document.select( selector );
这将会:
- 返回给定元素的CSS选择器。
- 在文档中搜索给定的CSS选择器。
- 返回与选择器匹配的元素列表。
第二行不是问题;第一行有问题。
问题
哪个API可以从DOM元素生成一个尽可能唯一的CSS选择器?
如果没有现有的API,那么知道这一点会很好。
>
和:eq()
来模拟XPath表达式的选择器。不清楚这样做的用途是什么——它将精确地选择该元素而不会选择其他任何内容,因此您的示例代码将毫无用处。那么你实际使用这样的API的用例是什么? - Jeffrey Bosboom