我正在尝试使用JSoup从Amazon中提取价格,但有两个不同的元素可以提取它。我可以从元素中的aria-tag属性中获取它,也可以从元素中的文本中获取它。最好,我总是想从aria-tag属性中获取它,但有时它不存在,所以我需要从第二个span类中提取它。我的问题是,如何创建一个if语句来检查属性是否有任何文本,然后如果没有,尝试从第二个span类中提取文本?
另外,我试图从名称相同的类中获取几个价格,但是当我编写 doc.select(“span.sx-price.sx-price.sx-价格-大”).get(0).text()
时,没有任何弹出。
以下是我要从中提取项目的一个项目的 HTML 代码:
<a class="a-size-small a-link-normal a-text-normal" href="https://rads.stackoverflow.com/amzn/click/B01MZYYWUH">1</a></div>
<div class="a-row a-spacing-mini"><span class="a-size-small a-color-secondary a-text-bold">Product Description</span><br><span class="a-size-small a-color-secondary">... Cards Radeon™ <em>RX</em> 460 Graphics Cards Radeon™ R9 <em>390</em> Graphics Cards ...</span></div>
</div></div></div></div></div></div></li>
<li id="result_2" data-asin="B00IAAU6SS" class="s-result-item celwidget ">
<div class="s-item-container">
<div class="a-fixed-left-grid">
<div class="a-fixed-left-grid-inner" style="padding-left:218px">
<div class="a-fixed-left-grid-col a-col-left" style="width:218px;margin-left:-218px;_margin-left:-109px;float:left;">
<div class="a-row">
<div aria-hidden="true" class="a-column a-span12 a-text-center">
<a class="a-link-normal a-text-normal" href="https://rads.stackoverflow.com/amzn/click/B00IAAU6SS"><img src="https://images-na.ssl-images-amazon.com/images/I/419c5Ci-UqL._AC_US218_.jpg" srcset="https://images-na.ssl-images-amazon.com/images/I/419c5Ci-UqL._AC_US218_.jpg 1x, https://images-na.ssl-images-amazon.com/images/I/419c5Ci-UqL._AC_US327_FMwebp_QL65_.jpg 1.5x, https://images-na.ssl-images-amazon.com/images/I/419c5Ci-UqL._AC_US436_FMwebp_QL65_.jpg 2x, https://images-na.ssl-images-amazon.com/images/I/419c5Ci-UqL._AC_US500_FMwebp_QL65_.jpg 2.2935x" width="218" height="218" alt="Product Details" class="s-access-image cfMarker" data-search-image-load></a>
<div class="a-section a-spacing-none a-text-center"></div>
</div>
</div>
</div>
<div class="a-fixed-left-grid-col a-col-right" style="padding-left:2%;*width:97.6%;float:left;">
<div class="a-row a-spacing-small">
<div class="a-row a-spacing-none scx-truncate-medium sx-line-clamp-3 s-list-title-long">
<a class="a-link-normal s-access-detail-page s-color-twister-title-link a-text-normal" title="Arctic Accelero Xtreme IV 280(X) - High-End Graphics Card Cooler with Backside Cooler for Efficient RAM and VR-Cooling - DCACO-V930001-GBA01" href="https://rads.stackoverflow.com/amzn/click/B00IAAU6SS">
<h2 data-attribute="Arctic Accelero Xtreme IV 280(X) - High-End Graphics Card Cooler with Backside Cooler for Efficient RAM and VR-Cooling - DCACO-V930001-GBA01" data-max-rows="3" class="a-size-medium s-inline s-access-title a-text-normal">Arctic Accelero Xtreme IV 280(X) - High-End Graphics Card Cooler with Backside Cooler for Efficient RAM and VR-Cooling - DCACO-V930001-GBA01</h2>
</a>
</div>
<div class="a-row a-spacing-none"><span class="a-size-small a-color-secondary">by </span><span class="a-size-small a-color-secondary">ARCTIC</span></div>
</div>
<div class="a-row">
<div class="a-column a-span7">
<div class="a-row a-spacing-none"><a class="a-link-normal a-text-normal" href="https://rads.stackoverflow.com/amzn/click/B00IAAU6SS"><span aria-label="$85.99" class="a-color-base sx-zero-spacing"><span class="sx-price sx-price-large">
<sup class="sx-price-currency">$</sup>
<span class="sx-price-whole">85</span>
<sup class="sx-price-fractional">99</sup>
</span>
</span></a><span class="a-letter-space"></span><i class="a-icon a-icon-prime a-icon-small s-align-text-bottom" aria-label="Prime"><span class="a-icon-alt">Prime</span></i>
</div>
<div class="a-row a-spacing-mini">
<div class="a-row a-spacing-none"><span class="a-size-small a-color-secondary">FREE Shipping on eligible orders</span></div>
<div class="a-row a-spacing-none"><span class="a-size-small a-color-price">Only 8 left in stock - order soon.</span></div>
</div>
<div class="a-row a-spacing-mini">
<div class="a-row a-spacing-none">
<div class="a-row a-spacing-mini"></div>
<span class="a-size-small a-color-secondary">More Buying Choices</span>
</div>
<div class="a-row a-spacing-none">
<a class="a-size-small a-link-normal a-text-normal" href="https://rads.stackoverflow.com/amzn/click/B00IAAU6SS"><span class="a-color-secondary a-text-strike"></span><span class="a-size-base a-color-base">$85.99</span>
根据您的示例,我们选择< code>span。之后,检查“selected”元素是否为< code>NULL,如果不是< code>NULL,则从子span的。
试试这个(它还没有被我测试过-只是由内存编写的(当然你需要先获取一个文档,我想你已经有了)):
try{
Element span = doc.select("span.a-color-base.sx-zero-spacing").first();
if(span != null) {
System.out.println(span.attr("aria-label"));
} else {
Element beforeSep = doc.select("span.sx-price-whole").first();
Element afterSep = doc.select("sup.sx-price-fractional").first();
System.out.println(beforeSep.text() + "." + afterSep.text());
}
} catch (Exception ex){
// exception handler
}
我建议选择带有class. sx-price
的元素,因为它的名称表明它包含价格。然后您可以选择需要aria-tag
属性的父元素,使用简单的正则表达式检查它是否包含价格-如果为真,则直接从此属性中获取价格,否则从嵌套的子跨度中收集数据。
下面你可以找到一个我玩过的代码,工作得很好。
final Document doc = Jsoup.parse(html);
final Elements prices = doc.select(".sx-price");
final Pattern pattern = Pattern.compile("^\\$?([0-9]+)\\.([0-9]{2})$");
for (Element el : prices) {
String price = "";
if (el.parent().hasAttr("aria-label") && pattern.matcher(el.parent().attr("aria-label")).find()) {
System.out.println("Extracting price from aria-label...");
price = el.parent().attr("aria-label");
} else {
System.out.println("Extracting price from span body...");
String currency = el.select(".sx-price-currency").text();
String whole = el.select(".sx-price-whole").text();
String fractional = el.select(".sx-price-fractional").text();
price = String.format("%s%s.%s", currency, !whole.isEmpty() ? whole : "00", !fractional.isEmpty() ? fractional : "00");
}
System.out.println(price);
}
我希望有帮助。
给定以下标记: 如何在。分隔符后选择类。first和。second?我尝试了以下几点: 然而,这似乎并不奏效。我以为这是这样的,从左到右: 既然它不能工作,我想我误解了其中一个选择器的功能。感谢任何帮助(或这方面的替代方案)。 PS: 标记来自外部源。虽然我可以在技术上用JS添加一个类,但如果可能的话,我更倾向于不添加。我也尝试过使用“:not”选择器,但我也没有得到它的工作。 谢谢 编辑: 在屏
问题内容: 我正在寻找下表的CSS选择器: 是否有任何选择器来匹配所有包含“ male”的TD? 问题答案: 如果我正确阅读了说明书,否。 您可以匹配元素,元素中属性的名称以及元素中命名属性的值。不过,我看不到任何与内容匹配的元素。
问题内容: 在以下HTML中,我想在图像悬停时将悬停效果应用于标题。是否有CSS选择器可以执行此操作? 的HTML 问题答案: 更新:主题说明符似乎已从Selectors Level 4规范的 编辑者草案(2014年5月6日)中 删除。这样就无法使用CSS来实现这一目标。 选择器级别4引入了主题说明符,该说明符允许: 选择。 当前不存在浏览器支持AFAIK。 您可以在JavaScript中对其进行
问题内容: 我有一个div: 有什么方法可以检查某些元素: 具有特定的类(在我的情况下为“测试”)。 或者,是否有方法检查en元素是否具有某种样式?在此示例中,我想知道元素是否具有“ ”。 非常感谢你! 问题答案:
我已经为我的应用程序实现了shedlock,对于我们拥有的两台服务器来说,它运行良好,没有任何问题。 我们现在在另一个域上添加了两个新服务器,shedlock也会选择它们。(好吧,这就是它的本意) 我有一份工作,创建pdf文件并将其放在文件夹中。添加的新服务器无权访问这些文件夹。因此,当这两个新服务器选择作业时,我的作业将失败。 有没有可能告诉夏洛克从我的两台服务器中选择任何一台,或者不选择另外两
当单击的elemenet是父元素的最后一个子元素时,我要显示报警。我的HTML结构: 在本例中,我希望在单击该元素(父行的最后一个元素)时显示报警: 我知道我可以使用这样的somethink获得最后一个元素(但我不能在我的例子中使用这个): 我想试着做这样的事,但每次都是假的