【问题标题】:Scrape currency exchange data from https://uzmanpara.milliyet.com.tr/doviz-kurlari/从 https://uzmanpara.milliyet.com.tr/doviz-kurlari/ 抓取货币兑换数据
【发布时间】:2021-09-04 17:07:03
【问题描述】:

我需要从网站获取货币数据,这里是网站HTML 表代码:

<tr>
   <td class="currency-up"></td>
   <td class="currency">
      <a href="/dolar-kuru/" target="_blank" data-adservice-interactive-adunit="9927946/milliyet/uzmanpara/interstitial_oop">ABD Doları</a>
   </td>
   <td class>8,2805</td>
   <td class>8,2856</td>
</tr>

我写了这些代码,但我无法处理这些代码:

String url = "https://uzmanpara.milliyet.com.tr/doviz-kurlari/";
Document doc = null;
try {
    doc = Jsoup.connect(url).timeout(6000).get();
} catch (IOException ex) {
    Logger.getLogger(den3.class.getName()).log(Level.SEVERE, null, ex);
}
Element link = doc.select("href").first();

String linkHref = link.attr("href"); // "http://example.com/"
System.out.println(linkHref);

但我遇到了这个问题:

线程“AWT-EventQueue-0”java.lang.NullPointerException 中的异常: 无法调用“org.jsoup.nodes.Element.attr(String)”,因为“link”是 空

我该如何处理这个问题,如何获得货币汇率。

【问题讨论】:

  • 你应该清楚地说明你想通过使用Jsoup提取站点数据来产生什么输出。

标签: java jsoup


【解决方案1】:

你可以这样试试:

Element link = doc.select("a[href]").first();

如果您只输入href,它将搜索href 标记名,但从来没有这样的标记名。您必须寻找a 标签的href 属性。

让我们从一个简单的例子开始。

例如,要获取href值为/dolar-kuru/的元素下面的第二个span的值,可以尝试:

// Example of selection with id.
Element element2 = doc.select("#usd_header_son_data").first();
String usd2 = element2.text();
System.out.println(usd2);

// Example of selecting 2nd span with href value and below. (1)
Element element1 = doc.select("a[href='/dolar-kuru/'] > span > span").first();
String usd1 = element1.text();
System.out.println(usd1);

// Example of selecting 2nd span with href value and below. (2)
Element element3 = doc.select("a[href='/dolar-kuru/'] > span :nth-child(2)").first();
String usd3 = element3.text();
System.out.println(usd3);

我们可以把这个例子更进一步。

让我们从汇率表中获取买入和卖出价格。

Elements elements = doc.select(".borsaMain > div:nth-child(2) > div:nth-child(1) > table td.currency");
for (Element element : elements) {
    Elements curreny = element.parent().select("td:nth-child(2)");
    Elements buy = element.parent().select("td:nth-child(3)");
    Elements sell = element.parent().select("td:nth-child(4)");
    System.out.println(String.format("%s [buy=%s, sell=%s]",
            curreny.text(), buy.text(), sell.text()));
}

将给出如下所示的输出:

ABD Doları [buy=8,2855, sell=8,2888]
Euro [buy=9,8389, sell=9,8645]
İngiliz Sterlini [buy=11,4203, sell=11,4775]
Kanada Doları [buy=6,5696, sell=6,6091]
İsviçre Frangı [buy=9,0128, sell=9,0671]
Suudi Riyali [buy=2,2025, sell=2,2135]
...

可以使用更多不同的选择器,请参阅。 https://jsoup.org/cookbook/extracting-data/selector-syntax

【讨论】:

  • 我使用了这段代码,但是我得到了一个很长的文本,它返回了网站的所有文本。如何将它拆分为数组它不起作用
  • 只返回 a 标记,它找到的第一个 href 属性
  • 非常感谢,它可以用土耳其语“Allah Razı Olsun”...
  • 亲爱的 İsmail,昨天这个程序工作了,但是在午夜之后,它从现在开始就没有工作了,我得到了 NULL 值,我通过 Document parse 更改了 Document 连接但仍然没有得到任何值,怎么能我处理它
  • 我再次尝试现在它可以工作了,如果有连接问题,请考虑当您想从持久源检索数据时它们可能容易受到攻击。
【解决方案2】:

对于提供的 HTML 代码,您可以执行以下操作:

Element link = doc.select("a[href]").first();
String linkHref = link.attr("href");
System.out.println(linkHref);

对于代码示例中提供的url,如果你只想选择第一个,你可以这样做:

Element link = doc.select("td.currency > a").first();
String linkHref = link.attr("href");
System.out.println(linkHref);

只是为了解释前面的代码:“td.currency”将搜索“货币”类的“td”标签。而“ > a”将检索属于“a”标签的子元素。

如果你想要所有货币,你可以这样做

Elements links = doc.select("td.currency > a");
links.forEach(link -> System.out.println(link.attr("href")));

请注意,上一个代码示例中有一些重复项。

【讨论】:

  • 我尝试了上述所有有用的答案,但我无法在 8,2805 中获取数据“8,28”
猜你喜欢
  • 2018-06-23
  • 1970-01-01
  • 1970-01-01
  • 2013-08-05
  • 2012-06-10
  • 2016-06-19
  • 1970-01-01
  • 1970-01-01
  • 2015-10-31
相关资源
最近更新 更多