【发布时间】:2016-06-22 09:36:49
【问题描述】:
我正在尝试解析包含多个具有以下结构的单元格的 HTML 表格:
<td id="topic1234">
<a name='1234'></a>
<b><a href='/url'>Title</a><b>
<span class='s'>Details</span>
</td>
<td id="topic2345">
<a name='2345'></a>
<b><a href='/url'>Title</a><b>
<span class='s'>Details</span>
</td>
...
'id' 属性、'a' 元素带有 'href' 属性和 'span' 元素是重要的细节,这两个元素是直接嵌套的。 我尝试使用
select("[id^=topic]"
+ ":has(> b > a[href])"
+ ":has(> span.s)")
但结果列表为空。当我将其更改为:
select("td[id^=topic]"
+ ":has(td > b > a[href])"
+ ":has(td > span.s)")
但我不希望选择器依赖于根元素是“td”这一事实,并且根据文档判断,前者也应该可以工作。以下也不起作用:
select("[id^=topic]"
+ ":has(:root > b > a[href])"
+ ":has(:root > span.s)")
我在这里做错了吗?顺便使用Jsoup 1.8.3。
【问题讨论】:
-
:root不起作用,因为无论选择器的范围如何,它总是引用文档根 - 在 HTML 中,这通常是 。在 selectors-4 中,这通常由:scope表示 - 我怀疑它在 jsoup 中是否有效,但...... -
也许
:has(> b >...)不起作用,因为 jsoup 也不支持相对选择器,在这种情况下,您可能不得不求助于选择[id^=...]元素并分别检查其子元素。在这种情况下,您可以使用选择器获得的最接近的是:has(b >...),但我相信您知道这并不意味着完全相同。 -
您的完整 HTML 结构如何?我的意思是,
<td>元素是否存在于<table>标签中?我问你这个是因为根据this answer,JSoup 无法检测到“孤独”tds。 -
@user2340612:好吧,考虑到问题的第一句话,我假设单元格实际上存在于表格中。
-
@user2340612:无论哪种方式都明确无害 :)
标签: java html web-scraping css-selectors jsoup