从 Android 上的 Jsoup 文档写入文件并搜索特定令牌
Writing a file from Jsoup document on Andorid and search for specific token
我是 android 的新手,我正在尝试为一个学校项目创建一个应用程序,该应用程序可以从网站上获取一条信息。我正在使用 Jsoup 创建文档,然后尝试将站点中的 html 作为文件存储在本地。我想要的数字写在长 html 文件中的 "Average" 之后,所以我尝试提取该部分。例如,令牌可能看起来像“class=sep-t>Average30 °C
当我 运行 应用程序在我点击按钮时崩溃。我在 onClick 函数中得到 java.lang.NumberFormatException: empty String。这是否意味着我的文件没有被正确写入?我怎么解决这个问题?
提前致谢!非常感谢详细的答案,因为我不习惯 java 编程。也喜欢一些关于如何以更有效的方式提取数字的技巧。
import android.content.Context;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.util.Scanner;
public class MainActivity extends AppCompatActivity {
private TextView ViewT;
private Double tempDouble;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button) findViewById(R.id.button1);
ViewT = (TextView) findViewById(R.id.ViewT);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new getData().execute();
File fileR = new File(getFilesDir(), "Tempfile.txt");
Scanner scR = null;
try {
scR = new Scanner(fileR);
} catch (FileNotFoundException e) {
e.printStackTrace();
}//Det funkar hit
while (scR.hasNext()) {
String line = scR.next();
if (line.matches("[Average</th><td>]")) {
String temperature = line.replaceAll("[^0-9]+", "");
double tempDouble = Double.parseDouble(temperature); //d == 3.78d
ViewT.setText(temperature);
Toast toast = Toast.makeText(getApplicationContext(), line, Toast.LENGTH_SHORT);
toast.show();
}
}
}
});
}
public class getData extends AsyncTask<Void, Void, Void> {
String avgT;
String fileNameT = "Tempfile.txt";
@Override
protected Void doInBackground(Void... params) {
Document temp;
try {
temp = Jsoup.connect("http://www.timeanddate.com/weather/singapore/singapore/historic").get(); //avg temp
avgT=temp.html();
FileWriter fw1 = new FileWriter(fileNameT);
PrintWriter pw1 = new PrintWriter(fw1);
pw1.println(avgT);
pw1.close();
fw1.close();
FileOutputStream fos = openFileOutput(fileNameT, Context.MODE_PRIVATE);
fos.write(avgT.getBytes());
fos.close();
}catch (Exception e){e.printStackTrace();}
return null;
}
}
}
只需使用 jsoup 即可 select elements using CSS selectors。
示例代码
Document temp = Jsoup.connect("http://www.timeanddate.com/weather/singapore/singapore/historic").get();
Element avgTemp = temp.select("tr.sep-t > td").first();
System.out.println(avgTemp.text());
输出
30 °C
我是 android 的新手,我正在尝试为一个学校项目创建一个应用程序,该应用程序可以从网站上获取一条信息。我正在使用 Jsoup 创建文档,然后尝试将站点中的 html 作为文件存储在本地。我想要的数字写在长 html 文件中的 "Average" 之后,所以我尝试提取该部分。例如,令牌可能看起来像“class=sep-t>Average30 °C
当我 运行 应用程序在我点击按钮时崩溃。我在 onClick 函数中得到 java.lang.NumberFormatException: empty String。这是否意味着我的文件没有被正确写入?我怎么解决这个问题?
提前致谢!非常感谢详细的答案,因为我不习惯 java 编程。也喜欢一些关于如何以更有效的方式提取数字的技巧。
import android.content.Context;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.util.Scanner;
public class MainActivity extends AppCompatActivity {
private TextView ViewT;
private Double tempDouble;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button) findViewById(R.id.button1);
ViewT = (TextView) findViewById(R.id.ViewT);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new getData().execute();
File fileR = new File(getFilesDir(), "Tempfile.txt");
Scanner scR = null;
try {
scR = new Scanner(fileR);
} catch (FileNotFoundException e) {
e.printStackTrace();
}//Det funkar hit
while (scR.hasNext()) {
String line = scR.next();
if (line.matches("[Average</th><td>]")) {
String temperature = line.replaceAll("[^0-9]+", "");
double tempDouble = Double.parseDouble(temperature); //d == 3.78d
ViewT.setText(temperature);
Toast toast = Toast.makeText(getApplicationContext(), line, Toast.LENGTH_SHORT);
toast.show();
}
}
}
});
}
public class getData extends AsyncTask<Void, Void, Void> {
String avgT;
String fileNameT = "Tempfile.txt";
@Override
protected Void doInBackground(Void... params) {
Document temp;
try {
temp = Jsoup.connect("http://www.timeanddate.com/weather/singapore/singapore/historic").get(); //avg temp
avgT=temp.html();
FileWriter fw1 = new FileWriter(fileNameT);
PrintWriter pw1 = new PrintWriter(fw1);
pw1.println(avgT);
pw1.close();
fw1.close();
FileOutputStream fos = openFileOutput(fileNameT, Context.MODE_PRIVATE);
fos.write(avgT.getBytes());
fos.close();
}catch (Exception e){e.printStackTrace();}
return null;
}
}
}
只需使用 jsoup 即可 select elements using CSS selectors。
示例代码
Document temp = Jsoup.connect("http://www.timeanddate.com/weather/singapore/singapore/historic").get();
Element avgTemp = temp.select("tr.sep-t > td").first();
System.out.println(avgTemp.text());
输出
30 °C