提问人:KotlinRookie 提问时间:4/8/2023 更新时间:4/9/2023 访问量:63
我的 Jsoup 解析代码再也找不到“价格”数据了
My Jsoup parsing code can no longer find the "price" data anymore
问:
我正在解析一个网站的商品价格,在我的代码中我使用了:
val parseId : Elements = doc2.select("#PriceSection")
val spanSelected : Elements = parseId.select("span")
stringBuilder2.append(spanSelected)
val spanToString = stringBuilder2.toString()
for(char in spanToString){
list2.add(char)
}
val newList2 = list2.toString()
val cutString2 = newList2.substring(75,105)
这已经工作了几个星期,但现在这似乎不起作用,除了我需要的那一点之外,我只是得到了其他所有东西。我不知道如何收集我需要的数据(HTML 代码的最后一行,在 span 类中)。我尝试了 和 的组合,但我无法弄清楚为什么 Jsoup 再也找不到文本了。:has
:contains
以下是来自该网站的 HTML 代码:
<div id="PriceSection" class="cds-flex-f1g67tkn cds-column-reverse-c1skacs4 cds-borderedTop-b1fsiv3z">
<div class="cds-flex-f1g67tkn cds-3-_64wlqa cds-2-_1xqs9y8 cds-2-_rro7jr" style="width: calc(100% - 1px);">
<div style="width: 100%;">
<div class="cds-flex-f1g67tkn cds-2-_vhy4ik" style="width: 100%;">
<div class="cds-flex-f1g67tkn cds-row-r1tfxker cds-space-between-s1vbz1 cds-0-_1t4ck38 cds-1-_uaer6w cds-1-_qem5ui" style="width: 100%;">
<div class="cds-flex-f1g67tkn cds-center-ca5ylan cds-center-czxavit" style="height: fit-content;">
<button type="button" aria-pressed="false" aria-label="1 hour" class="cds-interactable-i9xooc6 cds-transparentChildren-tnzgr0o cds-focusRing-fd371rq cds-transparent-tlx9nbb cds-scaledDownState-sxr2bd6 cds-pressableResetStyles-p1yut83c" style="--interactable-border-radius:100px; --interactable-background:var(--transparent); --interactable-hovered-background:transparent; --interactable-hovered-opacity:0.88; --interactable-pressed-background:transparent; --interactable-pressed-opacity:0.82; --interactable-disabled-background:transparent;">
<span class="cds-typographyResets-t1xhpuq2 cds-label1-ln29cth cds-foreground-f1yzxzgu cds-transition-txjiwsi cds-start-s1muvu8a cds-block-bas7n4z cds-noWrap-n1er3x1v cds-1-_fibjmj cds-1-_18ml2at cds-2-_rro7jr cds-2-_1gzxkm" style="color: var(--foreground-muted);">1H</span>
</button>
</div>
<div class="cds-flex-f1g67tkn cds-center-ca5ylan cds-center-czxavit" style="height: fit-content;">
<button type="button" aria-pressed="true" aria-label="1 day" class="cds-interactable-i9xooc6 cds-transparentChildren-tnzgr0o cds-focusRing-fd371rq cds-transparent-tlx9nbb cds-scaledDownState-sxr2bd6 cds-pressableResetStyles-p1yut83c" style="--interactable-border-radius:100px; --interactable-background:var(--primary-wash); --interactable-hovered-background:rgb(240, 243, 250); --interactable-hovered-opacity:0.98; --interactable-pressed-background:rgb(226, 229, 236); --interactable-pressed-opacity:0.92; --interactable-disabled-background:rgb(250, 252, 255);">
<span class="cds-typographyResets-t1xhpuq2 cds-label1-ln29cth cds-foreground-f1yzxzgu cds-transition-txjiwsi cds-start-s1muvu8a cds-block-bas7n4z cds-noWrap-n1er3x1v cds-1-_fibjmj cds-1-_18ml2at cds-2-_rro7jr cds-2-_1gzxkm" style="color: rgb(181, 54, 6);">1D</span>
</button>
</div>
<div class="cds-flex-f1g67tkn cds-center-ca5ylan cds-center-czxavit" style="height: fit-content;">
<button type="button" aria-pressed="false" aria-label="1 week" class="cds-interactable-i9xooc6 cds-transparentChildren-tnzgr0o cds-focusRing-fd371rq cds-transparent-tlx9nbb cds-scaledDownState-sxr2bd6 cds-pressableResetStyles-p1yut83c" style="--interactable-border-radius:100px; --interactable-background:var(--transparent); --interactable-hovered-background:transparent; --interactable-hovered-opacity:0.88; --interactable-pressed-background:transparent; --interactable-pressed-opacity:0.82; --interactable-disabled-background:transparent;">
<span class="cds-typographyResets-t1xhpuq2 cds-label1-ln29cth cds-foreground-f1yzxzgu cds-transition-txjiwsi cds-start-s1muvu8a cds-block-bas7n4z cds-noWrap-n1er3x1v cds-1-_fibjmj cds-1-_18ml2at cds-2-_rro7jr cds-2-_1gzxkm" style="color: var(--foreground-muted);">1W</span>
</button>
</div>
<div class="cds-flex-f1g67tkn cds-center-ca5ylan cds-center-czxavit" style="height: fit-content;">
<button type="button" aria-pressed="false" aria-label="1 month" class="cds-interactable-i9xooc6 cds-transparentChildren-tnzgr0o cds-focusRing-fd371rq cds-transparent-tlx9nbb cds-scaledDownState-sxr2bd6 cds-pressableResetStyles-p1yut83c" style="--interactable-border-radius:100px; --interactable-background:var(--transparent); --interactable-hovered-background:transparent; --interactable-hovered-opacity:0.88; --interactable-pressed-background:transparent; --interactable-pressed-opacity:0.82; --interactable-disabled-background:transparent;">
<span class="cds-typographyResets-t1xhpuq2 cds-label1-ln29cth cds-foreground-f1yzxzgu cds-transition-txjiwsi cds-start-s1muvu8a cds-block-bas7n4z cds-noWrap-n1er3x1v cds-1-_fibjmj cds-1-_18ml2at cds-2-_rro7jr cds-2-_1gzxkm" style="color: var(--foreground-muted);">1M</span>
</button>
</div>
<div class="cds-flex-f1g67tkn cds-center-ca5ylan cds-center-czxavit" style="height: fit-content;">
<button type="button" aria-pressed="false" aria-label="1 year" class="cds-interactable-i9xooc6 cds-transparentChildren-tnzgr0o cds-focusRing-fd371rq cds-transparent-tlx9nbb cds-scaledDownState-sxr2bd6 cds-pressableResetStyles-p1yut83c" style="--interactable-border-radius:100px; --interactable-background:var(--transparent); --interactable-hovered-background:transparent; --interactable-hovered-opacity:0.88; --interactable-pressed-background:transparent; --interactable-pressed-opacity:0.82; --interactable-disabled-background:transparent;">
<span class="cds-typographyResets-t1xhpuq2 cds-label1-ln29cth cds-foreground-f1yzxzgu cds-transition-txjiwsi cds-start-s1muvu8a cds-block-bas7n4z cds-noWrap-n1er3x1v cds-1-_fibjmj cds-1-_18ml2at cds-2-_rro7jr cds-2-_1gzxkm" style="color: var(--foreground-muted);">1Y</span>
</button>
</div>
<div class="cds-flex-f1g67tkn cds-center-ca5ylan cds-center-czxavit" style="height: fit-content;">
<button type="button" aria-pressed="false" aria-label="ALL" class="cds-interactable-i9xooc6 cds-transparentChildren-tnzgr0o cds-focusRing-fd371rq cds-transparent-tlx9nbb cds-scaledDownState-sxr2bd6 cds-pressableResetStyles-p1yut83c" style="--interactable-border-radius:100px; --interactable-background:var(--transparent); --interactable-hovered-background:transparent; --interactable-hovered-opacity:0.88; --interactable-pressed-background:transparent; --interactable-pressed-opacity:0.82; --interactable-disabled-background:transparent;">
<span class="cds-typographyResets-t1xhpuq2 cds-label1-ln29cth cds-foreground-f1yzxzgu cds-transition-txjiwsi cds-start-s1muvu8a cds-block-bas7n4z cds-noWrap-n1er3x1v cds-1-_fibjmj cds-1-_18ml2at cds-2-_rro7jr cds-2-_1gzxkm" style="color: var(--foreground-muted);">ALL</span>
</button>
</div>
</div>
</div>
<div class="cds-flex-f1g67tkn cds-center-ca5ylan cds-space-between-s1vbz1 cds-2-_vhy4ik">
<div class="cds-flex-f1g67tkn cds-0-_1jhyfz6 cds-0-_x4cyln" style="flex-grow: 1;">
<div class="cds-flex-f1g67tkn cds-2-_rro7jr">
<div aria-hidden="true" style="width: 100%;">
<div class="cds-typographyResets-t1xhpuq2 cds-headline-hb7l4gg cds-foregroundMuted-f1vw1sy6 cds-transition-txjiwsi cds-start-s1muvu8a">
<span>Price</span>
</div>
<div class="cds-flex-f1g67tkn cds-baseline-b1fcn5pa cds-column-ci8mx7v cds-0-_1t4ck38">
<div class="cds-typographyResets-t1xhpuq2 cds-display3-doujgnf cds-foreground-f1yzxzgu cds-transition-txjiwsi cds-start-s1muvu8a cds-tabularNumbers-t11sqpt cds-1-_qem5ui">
<span>£22,508.13</span>
</div>
<span
过去发生的事情是,我可以阅读跨度类中的“£22,508.13”,但现在我不能(底部跨度类)。
我的代码查找一个名为“PriceSection”的类,然后在“PriceSection”内部查找以从内部获取所有跨度类。然后,我过滤掉我不需要的东西。
使用相同的代码,我现在得到一个单词“Relative”,它似乎来自包含我想要的信息的类之后的另一个 html 类。
为什么 Jsoup 现在找不到 span 类(包含价格),而它以前工作正常?
答:
1赞
TDG
4/9/2023
#1
事情停止工作是有原因的 - 要么是网站发生了变化,要么是你的代码发生了变化。您的代码是否包含您期望的所有 html?如果您打印(到屏幕或文件),它是否具有所有预期的 html?
您最近是否对代码进行了任何更改?
另一点 - 不要使用“幻数”,例如 75 和 105。由于价格在最后一个跨度中,因此可以使用以下代码:doc2
val el = doc2.select("#PriceSection span")
println(el?.last()?.text())
评论
0赞
KotlinRookie
4/10/2023
我刚刚尝试了您的代码,它没有打印我需要的内容,我只是得到一个“X”字符,就好像某些跨度类对 jsoup 隐藏一样。我已经几周没有更改我的代码了,所以我从中检索数据的站点一定已经更改
0赞
TDG
4/10/2023
尝试在浏览器中禁用 javascript 并加载页面。如果它没有显示您需要的值,则它正在动态加载,您必须考虑不同的解决方案。
0赞
KotlinRookie
4/12/2023
我禁用了javascript,大部分网站都停止了工作。包括我需要的位。所以这意味着 Jsoup 是问题所在,因为我认为它不能解析 JS。
0赞
TDG
4/12/2023
基本上你是对的,但在某些情况下你仍然可以使用 jsoup,但它不是微不足道的。您可以查看此问题和答案以及评论。
评论