使用 Jsoup 在网站中提交搜索

Submitting a search in website with Jsoup

我想创建一个应用程序,让我可以在此天气网站中搜索城市。 我希望您 return 与执行的搜索相对应的站点。 我尝试使用 EditText 和 Button 执行此操作,但搜索似乎不起作用,因为页面 returned 与初始页面相同。

我该如何解决这个问题?

这是我的代码:

final EditText editText = findViewById(R.id.edit);
        final TextView textView = findViewById(R.id.testo);
        Button button = findViewById(R.id.clicca);
        button.setOnClickListener(new View.OnClickListener() {
            Connection.Response res = null;
            Document doc;
            @Override
            public void onClick(View v) {
                try {
                    doc = Jsoup.connect("https://www.ilmeteo.it/meteo/cerca")
                            .data("citta", "bari")
                            .post();

                } catch (IOException e) {
                    e.printStackTrace();
                }
                textView.setText(doc.location());
            }
        });

这是站点的 HTML 代码:

<div id="search">
<a id="search-logo" href="https://www.ilmeteo.it" title="IL Meteo - Home Page"></a>
<a id="search-arrow" href="javascript:;" onclick="toggleSearchMenu('main');"></a>
<form id="form-search0" name="search0" action="https://www.ilmeteo.it/meteo/cerca" method="get" onsubmit="return CheckSearchForm0()">
<input id="search-main" name="citta" value="" size="17" maxlength="64" class="txtSearch" onfocus="this.className='txtSearch';openSearchMenu('main');virginSearch=false;" onblur="if(this.value=='')this.className='txtSearch txtSearchE'" title="Cerca comune o località" autocomplete="Off" tabindex="1" onkeyup="ajax_showOptions(this,'type=IT&amp;sort=smart',event)" type="text">
</form>
<a id="search-button" href="javascript:;" onclick="$('#form-search0').submit()"></a>

<div id="fav-search-cont"><span id="fav-search"></span></div>

</div>

编辑

谢谢大家!你的回答解决了我的问题:) 但是我在另一个天气网站上遇到了问题。我如何从这个其他站点执行与以前相同的操作?

P.S .: 这个网站的问题是强制点击城市搜索并且在URL中城市旁边有一个代码,像这样“http://www.meteo.it/meteo/roma-58091".

这是第二个站点的 HTML 代码:

<div class="pksrc">
   <form class="search-form" onsubmit="return false">
    <fieldset class="icon-lens">
     <input type="hidden" id="searchid" disabled="" value="">
     <input type="hidden" id="searchtarget" value="_blank">
     <input type="text" class="query " id="searchinput" name="search" value="" placeholder="Cerca località" autocomplete="off">
     <input type="submit" value="submit">
    </fieldset>
   </form>
   <div id="search-menu"></div>
   <ul id="search-option">
    <li><a href="/meteo/milano-15146" title="Milano">Milano</a></li>
    <li><a href="/meteo/roma-58091" title="Roma">Roma</a></li>
    <li><a href="/meteo/napoli-63049" title="Napoli">Napoli</a></li>
   </ul>
  </div>

String city = "Bari";
String url = "https://www.ilmeteo.it/meteo/cerca?citta="+ city;

Document doc = Jsoup.connect(url).get(); 
List<Element> rows = doc.select("table[class=datatable] > tbody > tr[id*='']");

for (Element row : rows) {
    System.out.println(row.text());
}

示例输出:

13 pioggia e schiarite 25.3° NW 35 / 36 forte51% 0.1 mm modeste0% 3070m1008mb 27°>10km buona 51 7.9
14 pioggia e schiarite 25.5° NW 34 / 35 forte50% 0.1 mm modeste0% 3050m1008mb 27°>10km buona 50 7.6
15 poco nuvoloso 25.5° NW 32 / 33 forte50% - assenti -0% 3070m1008mb 27°>10km buona 50 6.5
16 poco nuvoloso 25.4° NW 31 / 32 forte49% - assenti -0% 3100m1008mb 27°>10km buona 49 5.1
17 sereno 25° NW 30 / 31 moderato50% - assenti -0% 3130m1008mb 26°>10km buona 50 3.3
18 sereno 24.5° NNW 28 / 29 moderato52% - assenti -0% 3180m1008mb 25°>10km buona 52 1.6
19 sereno 23.7° NW 26 / 27 moderato54% - assenti -0% 3220m1009mb 24°>10km buona 54 0.4
20 sereno 22.6° NW 23 / 26 moderato57% - assenti -0% 3190m1009mb 23°>10km buona 57 0
21 sereno 21° NW 21 / 24 moderato68% - assenti -0% 3160m1009mb 21°>10km buona 68 0
22 poco nuvoloso 20° NW 19 / 24 moderato76% - assenti -0% 3130m1009mb 20°>10km buona 76 0
23 nubi sparse 19.4° WNW 18 / 24 moderato80% - assenti -0% 3130m1009mb 20°>10km buona 80 0
24 nubi sparse 19.2° WNW 18 / 23 moderato81% - assenti -0% 3130m1009mb 20°>10km buona 81 0
01 poco nuvoloso 19° WNW 18 / 22 moderato82% - assenti -0% 3140m1009mb 20°>10km buona 82 0
02 poco nuvoloso 18.6° WNW 17 / 21 moderato84% - assenti -0% 3160m1009mb 19°>10km buona 84 0

第二个问题的答案:

这是我发现导航到您要搜索的 "city" 页面的方法。

第 1 步:

将城市的首字母传递给请求并获得JSON响应。

例如:如果您想搜索 "Milano",则使用此 URL http://www.meteo.it/autosuggest/m.json?

获取字母 "m" 的结果

示例 JSON 响应是:

{
  "url": [
    {
      "ita": "meteo",
      "sea": "meteo-mare",
      "ski": "meteo-montagna",
      "eur": "meteo",
      "wor": "meteo"
    }
  ],
  "results": [
    {
      "code": "15146",
      "value": "Milano (MI)",
      "value_it": "milano",
      "value_en": "milan",
      "url": "ita"
    },
    {
      "code": "20030",
      "value": "Mantova (MN)",
      "value_it": "mantova",
      "value_en": "mantua",
      "url": "ita"
    },
  ]
}

从 JSON 响应中获取米兰城市代码 & value_it 例如:code=15146 & value_it=milano

第二步:

使用检索到的值构造 URL。 例如:http://www.meteo.it/meteo/value_it-代码

http://www.meteo.it/meteo/milano-15146

科马基奥城市示例:

请求URL:http://www.meteo.it/autosuggest/c.json

JSON 响应:

   {
      "code": "38006",
      "value": "Comacchio (FE)",
      "value_it": "comacchio",
      "value_en": "comacchio",
      "url": "ita"
    }

使用 JSON 值构造 URL:

http://www.meteo.it/meteo/comacchio-38006