java - Jsoup 设置接受 header 请求不起作用

标签 java html-parsing jsoup request-headers

我正在尝试以英文格式解析来自 tempobet.com 的数据。问题是,当我使用 google rest 客户端时,它会返回我想要的 html,但是,当我尝试通过 Jsoup 解析它时,它会以我的语言环境格式返回日期格式。这是测试代码

import java.io.IOException;
import java.util.Date;
import java.util.ListIterator;
import java.util.Locale;

import org.apache.commons.lang3.time.DateUtils;
import org.jsoup.Connection.Response;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.junit.Test;

public class ParseHtmlTest {

    @Test
    public void testName() throws IOException {

        Response response = Jsoup.connect("https://www.tempobet.com/league191_5_0.html")
                                 .userAgent("Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1667.0 Safari/537.36")
                                 .execute();

        Document doc = Jsoup.connect("https://www.tempobet.com/league191_5_0.html")
                            .userAgent("Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1667.0 Safari/537.36")
                            .header("Accept-Language", "en-US")
                            .header("Accept-Encoding", "gzip,deflate,sdch")
                            .cookies(response.cookies())
                            .get();

        Elements tableElement = doc.select("table[class=table-a]");
        ListIterator<Element> trElementIterator = tableElement.select("tr:gt(2)").listIterator();

        while (trElementIterator.hasNext()) {

            ListIterator<Element> tdElementIterator = trElementIterator.next().select("td").listIterator();

            while (tdElementIterator.hasNext()) {

                System.out.println(tdElementIterator.next());
            }
        }
    }
}

这是一个响应行示例

<td width="40" class="grey">21 Nis 20:00</td>

日期应该是 "21 Apr 20:00"。我将不胜感激任何帮助。还是谢谢

最佳答案

如果 tempobet 只看一下 Accept-Language header ,事情就会变得非常简单...

他们在不同的域上提供 tr (tempobet22.com) 和 en (tempobet.com)。对 en-domain 的第一次调用被重定向到 tr-domain。如果您选择另一种语言,他们会进行两次重定向和神奇的 session 共享。对于第一个重定向,您需要来自第一个域的 GAMBLINGSESS cookie,对于第二个域的第二个。 Jsoup 在跟随重定向时并不知道这一点...

String userAgent = "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1667.0 Safari/537.36";
// get a session for tr and en domain
String tempobetSession = Jsoup.connect("https://www.tempobet.com/").userAgent(userAgent).execute().cookie("GAMBLINGSESS");
String tempobet22Session = Jsoup.connect("https://www.tempobet22.com/").userAgent(userAgent).execute().cookie("GAMBLINGSESS");
// tell tr domain that we wont to go to en without following the redirect
String redirect = Jsoup.connect("https://www.tempobet22.com/?change_lang=https://www.tempobet.com/")
    .userAgent(userAgent).cookie("GAMBLINGSESS", tempobet22Session).followRedirects(false).execute().header("Location");
// Redirect goes to en domain including our hashed tr-cookie as parameter - but this redirect needs a en-cookie
Response response = Jsoup.connect(redirect).userAgent(userAgent).cookie("GAMBLINGSESS", tempobetSession).execute();
// finally...
Document doc = Jsoup.connect("https://www.tempobet.com/league191_5_0.html").userAgent(userAgent).cookies(response.cookies()).get();

关于java - Jsoup 设置接受 header 请求不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23140715/

相关文章:

java - JSF:有人说它是表示层,有人说它是网络层

java - 如何在android中添加崩溃分析

perl - 什么是用于 HTML MS Excel 文件的良好 CPAN 解析器?

python - 如何使用 Beautiful Soup 在一个查询中获取多个类

python - 使用 BeautifulSoup4 解析 HTML 表格

java - 在 java 中使用 Bouncy CaSTLe 进行 block 式 RSA 加密

java - 获取网站移动版?

java - 如何用java正确解析HTML?

java - 使用 Java 和 JSoup 从 HTML 文件中抓取数据 - Android Studio

java - 如何在 Netty Java 中创建 HeapBuffer?