كيفية الحصول على مصدر HTML لصفحة من رابط HTML في Android؟
-
19-09-2019 - |
سؤال
أنا أعمل في تطبيق يحتاج إلى الحصول على مصدر صفحة ويب من رابط، ثم تحليل HTML من تلك الصفحة.
هل يمكن أن تعطيني بعض الأمثلة، أو النقاط البدء حيث يجب أن ننظر إلى بدء كتابة مثل هذا التطبيق؟
المحلول
يمكنك استخدام httpclient. لأداء HTTP Get واسترداد استجابة HTML، شيء من هذا القبيل:
HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet(url);
HttpResponse response = client.execute(request);
String html = "";
InputStream in = response.getEntity().getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
StringBuilder str = new StringBuilder();
String line = null;
while((line = reader.readLine()) != null)
{
str.append(line);
}
in.close();
html = str.toString();
نصائح أخرى
أود أن أقترح jsoug..
وفقا لموقعهم:
جلب The Wikipedia الصفحة الرئيسية، تحليلها إلى DOM، وحدد العناوين الرئيسية من قسم الأخبار في قائمة العناصر (عينة عبر الإنترنت):
Document doc = Jsoup.connect("http://en.wikipedia.org/").get();
Elements newsHeadlines = doc.select("#mp-itn b a");
ابدء:
- تحميل مكتبة JSOV جرة الأساسية
- إقرأ ال كتاب الطبخ المقدمة
هذا السؤال قديم قليلا، لكنني أحسب أنني يجب أن نشر إجابتي الآن ذلك DefaultHttpClient
, HttpGet
, ، إلخ. يتم إهمالها. يجب أن تحصل هذه الوظيفة وإرجاع HTML، مع إعطاء عنوان URL.
public static String getHtml(String url) throws IOException {
// Build and set timeout values for the request.
URLConnection connection = (new URL(url)).openConnection();
connection.setConnectTimeout(5000);
connection.setReadTimeout(5000);
connection.connect();
// Read and store the result line by line then return the entire string.
InputStream in = connection.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
StringBuilder html = new StringBuilder();
for (String line; (line = reader.readLine()) != null; ) {
html.append(line);
}
in.close();
return html.toString();
}
public class RetrieveSiteData extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... urls) {
StringBuilder builder = new StringBuilder(100000);
for (String url : urls) {
DefaultHttpClient client = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(url);
try {
HttpResponse execute = client.execute(httpGet);
InputStream content = execute.getEntity().getContent();
BufferedReader buffer = new BufferedReader(new InputStreamReader(content));
String s = "";
while ((s = buffer.readLine()) != null) {
builder.append(s);
}
} catch (Exception e) {
e.printStackTrace();
}
}
return builder.toString();
}
@Override
protected void onPostExecute(String result) {
}
}
نسميها
new RetrieveFeedTask(new OnTaskFinished()
{
@Override
public void onFeedRetrieved(String feeds)
{
//do whatever you want to do with the feeds
}
}).execute("http://enterurlhere.com");
RetriveFeedTask.class.
class RetrieveFeedTask extends AsyncTask<String, Void, String>
{
String HTML_response= "";
OnTaskFinished onOurTaskFinished;
public RetrieveFeedTask(OnTaskFinished onTaskFinished)
{
onOurTaskFinished = onTaskFinished;
}
@Override
protected void onPreExecute()
{
super.onPreExecute();
}
@Override
protected String doInBackground(String... urls)
{
try
{
URL url = new URL(urls[0]); // enter your url here which to download
URLConnection conn = url.openConnection();
// open the stream and put it into BufferedReader
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String inputLine;
while ((inputLine = br.readLine()) != null)
{
// System.out.println(inputLine);
HTML_response += inputLine;
}
br.close();
System.out.println("Done");
}
catch (MalformedURLException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
return HTML_response;
}
@Override
protected void onPostExecute(String feed)
{
onOurTaskFinished.onFeedRetrieved(feed);
}
}
ontaskfinished.java.
public interface OnTaskFinished
{
public void onFeedRetrieved(String feeds);
}
واحد من الآخر لذا آخر إجابة ساعدني. هذا لا يقرأ الخط حسب الخط؛ من ينفذ أن ملف HTML لديه خط باطل ما بين أثنين. كما هو شرط مسبق إضافة هذا الاعتماد من إعدادات المشروع "com.koushikdutta.ion: أيون: 2.2.1" تنفيذ هذا الرمز في asynctask.. وبعد إذا كنت تريد العودة -شيئا ما- أن تكون في موضوع UI، اجتيازها إلى واجهة متبادلة.
Ion.with(getApplicationContext()). load("https://google.com/hashbrowns") .asString() .setCallback(new FutureCallback<String>() { @Override public void onCompleted(Exception e, String result) { //int s = result.lastIndexOf("user_id")+9; // String st = result.substring(s,s+5); // Log.e("USERID",st); //something } });