Lấy dữ liệu html từ 1 website


Từ: 10:32 14/06/2012
Bài: 112
Cảm ơn: 124
Thích: 18

 

Đầu tiên download thư viện http://htmlcleaner.sourceforge.net/download.php chúng ta sẽ được file htmlcleaner.jar

Bạn nên hiểu rõ về cấu trúc node ( trong dom hoặc trong 1 số loại khác )

tạo 1 thư mục tên là libs -> Nhấn chuột phải chọn Build Path -> Add to build path

Thêm đoạn : <uses-permission android:name="android.permission.INTERNET" /> vào trong AndroidManifest.xml để cho phép điện thoại được phép truy cập mạng 

 

Kế tiếp  chúng ta sẽ lấy dữ liệu từ trang http://ctms.fithou.net.vn/

 

private void load() {
HtmlCleaner cleaner = new HtmlCleaner();
CleanerProperties props = cleaner.getProperties();
props.setTranslateSpecialEntities(true);
props.setTransResCharsToNCR(true);
props.setOmitComments(true);
try {
TagNode tagNode = cleaner.clean(new URL(
"http://ctms.fithou.net.vn/"));
Object[] nodes = tagNode
.evaluateXPath("//table[@id='ctl00_LeftCol_ThoikhoabieuWeekView1_grvThoikhoabieu']");
TagNode table = (TagNode) nodes[0];
Object[] trNodes = table.evaluateXPath("//tr");//lấy thẻ tr trong nodes[0]
TagNode trTest = (TagNode) trNodes[0];
String str = cleaner.getInnerHtml(trTest);
Log.d("Tag", str);
 
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (XPatherException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
 
Chú ý đoạn
Object[] nodes = tagNode
.evaluateXPath("//table[@id='ctl00_LeftCol_ThoikhoabieuWeekView1_grvThoikhoabieu']");
đoạn này lấy id có tên là ctl00_LeftCol_ThoikhoabieuWeekView1_grvThoikhoabieu có loại là table, các bạn có thể tùy biến để lấy được những dữ liệu mình mong muốn .
Trong phần javadoc của framework đã trình bày khá chi tiết
 
Đây là kết quả sau khi chạy chương trình 
 
 
 
 
 
 

 

Label
Từ: 18:40 15/11/2012
Bài: 2
Cảm ơn: 4
Thích: 0

thanks. mình chạy thử source code nhưng nó báo lỗi. mình sai ở chỗ nào vậy. bạn add nick yahoo của mình đc không darkknight_snowdragon@yahoo.com , mình gửi hình cái lỗi cho bạn xem. có gì dễ hỏi hơn.


 

Label
Từ: 10:32 14/06/2012
Bài: 112
Cảm ơn: 124
Thích: 18

Bạn có thể upload hình lên photobucket.com , sau đó sử dụng chức năng hình ảnh trong diễn đàn và paste link vào đấy

Label
Từ: 10:32 14/06/2012
Bài: 112
Cảm ơn: 124
Thích: 18

Có thể bạn chưa convert lại project , bạn click chuột pải vào project , chọn properties , sau đó chọn mục Compile , chọn 1.6 ( mặc định là 1.5 hoặc 1.7 )

Label
Từ: 18:40 15/11/2012
Bài: 2
Cảm ơn: 4
Thích: 0

 

<tr>
  <td colspan="2" class="SubTitleNews_Special"><span id="_ctl1__ctl0__ctl0_lblHT_Gio_ThoiTietBanTinCapNhatLuc">Bản tin cập nhật lúc</span>
  13<sup>h</sup> ngày 02/12/2012</td>
  </tr>

đoạn trên mình lấy class="..." có loại td thì sẽ được

 

<span id="_ctl1__ctl0__ctl0_lblHT_Gio_ThoiTietBanTinCapNhatLuc">Bản tin cập nhật lúc</span>
  13<sup>h</sup> ngày 02/12/2012

Cho mình hỏi có cách nào bỏ thằng <span></span>; <sup></sup> để lấy được text cụ thể như thế này không:

 

Bản tin cập nhật lúc
  13 h  ngày 02/12/2012

thanks nha

Label
Từ: 10:32 14/06/2012
Bài: 112
Cảm ơn: 124
Thích: 18

Bạn sử dụng phương thức  [class của bạn ở dạng TagNode 'SubTitleNews_Special'].getText().toString()

Label
Từ: 10:32 14/06/2012
Bài: 112
Cảm ơn: 124
Thích: 18

Trước mình có lấy dữ liệu từ beta.bongda.com.vn như thế này . Hi vọng giúp đc bạn :)

 

 

TagNode root = cleaner.clean(new URL(url));
 
// lay tieu de
Object[] thebigoneClass = root
.evaluateXPath("//font[@class='thebigone']");
if (thebigoneClass.length > 0) {
TagNode thebigoneNode = (TagNode) thebigoneClass[0];
String tieude = thebigoneNode.getText().toString();
tieude = new String(tieude.getBytes(), "UTF-8");
tintuc.setTieude(tieude);
}
Label
Từ: 19:55 12/08/2013
Bài: 3
Cảm ơn: 3
Thích: 0

chào bạn  @nguyentungduong.9x1 ,

sao mình tải project của bạn về và build lên thi bị lỗi như vầy !

 

https://docs.google.com/file/d/0B9ewRcQPv9C0aERoaUJzcGdnb0E/edit

-------------------------------------------------------------------------------------------------------------------------------

08-12 12:55:56.238: E/Trace(1173): error opening trace file: No such file or directory (2)
08-12 12:55:57.689: D/AndroidRuntime(1173): Shutting down VM
08-12 12:55:57.689: W/dalvikvm(1173): threadid=1: thread exiting with uncaught exception (group=0x40a71930)
08-12 12:55:57.762: E/AndroidRuntime(1173): FATAL EXCEPTION: main
08-12 12:55:57.762: E/AndroidRuntime(1173): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.htmlcleaner/com.example.htmlcleaner.MainActivity}: android.os.NetworkOnMainThreadException
08-12 12:55:57.762: E/AndroidRuntime(1173): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
08-12 12:55:57.762: E/AndroidRuntime(1173): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
08-12 12:55:57.762: E/AndroidRuntime(1173): at android.app.ActivityThread.access$600(ActivityThread.java:141)
08-12 12:55:57.762: E/AndroidRuntime(1173): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
08-12 12:55:57.762: E/AndroidRuntime(1173): at android.os.Handler.dispatchMessage(Handler.java:99)
08-12 12:55:57.762: E/AndroidRuntime(1173): at android.os.Looper.loop(Looper.java:137)
08-12 12:55:57.762: E/AndroidRuntime(1173): at android.app.ActivityThread.main(ActivityThread.java:5041)
08-12 12:55:57.762: E/AndroidRuntime(1173): at java.lang.reflect.Method.invokeNative(Native Method)
08-12 12:55:57.762: E/AndroidRuntime(1173): at java.lang.reflect.Method.invoke(Method.java:511)
08-12 12:55:57.762: E/AndroidRuntime(1173): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
08-12 12:55:57.762: E/AndroidRuntime(1173): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
08-12 12:55:57.762: E/AndroidRuntime(1173): at dalvik.system.NativeStart.main(Native Method)
08-12 12:55:57.762: E/AndroidRuntime(1173): Caused by: android.os.NetworkOnMainThreadException
08-12 12:55:57.762: E/AndroidRuntime(1173): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117)
08-12 12:55:57.762: E/AndroidRuntime(1173): at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
08-12 12:55:57.762: E/AndroidRuntime(1173): at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
08-12 12:55:57.762: E/AndroidRuntime(1173): at java.net.InetAddress.getAllByName(InetAddress.java:214)
08-12 12:55:57.762: E/AndroidRuntime(1173): at libcore.net.http.HttpConnection.<init>(HttpConnection.java:70)
08-12 12:55:57.762: E/AndroidRuntime(1173): at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50)
08-12 12:55:57.762: E/AndroidRuntime(1173): at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:340)
08-12 12:55:57.762: E/AndroidRuntime(1173): at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:87)
08-12 12:55:57.762: E/AndroidRuntime(1173): at libcore.net.http.HttpConnection.connect(HttpConnection.java:128)
08-12 12:55:57.762: E/AndroidRuntime(1173): at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:316)
08-12 12:55:57.762: E/AndroidRuntime(1173): at libcore.net.http.HttpEngine.connect(HttpEngine.java:311)
08-12 12:55:57.762: E/AndroidRuntime(1173): at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:290)
08-12 12:55:57.762: E/AndroidRuntime(1173): at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:240)
08-12 12:55:57.762: E/AndroidRuntime(1173): at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:282)
08-12 12:55:57.762: E/AndroidRuntime(1173): at libcore.net.http.HttpURLConnectionImpl.getHeaderField(HttpURLConnectionImpl.java:139)
08-12 12:55:57.762: E/AndroidRuntime(1173): at org.htmlcleaner.HtmlCleaner.clean(HtmlCleaner.java:296)
08-12 12:55:57.762: E/AndroidRuntime(1173): at org.htmlcleaner.HtmlCleaner.clean(HtmlCleaner.java:317)
08-12 12:55:57.762: E/AndroidRuntime(1173): at com.example.htmlcleaner.MainActivity.load(MainActivity.java:32)
08-12 12:55:57.762: E/AndroidRuntime(1173): at com.example.htmlcleaner.MainActivity.onCreate(MainActivity.java:22)
08-12 12:55:57.762: E/AndroidRuntime(1173): at android.app.Activity.performCreate(Activity.java:5104)
08-12 12:55:57.762: E/AndroidRuntime(1173): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
08-12 12:55:57.762: E/AndroidRuntime(1173): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
08-12 12:55:57.762: E/AndroidRuntime(1173): ... 11 more
08-12 12:55:58.317: D/dalvikvm(1173): GC_CONCURRENT freed 183K, 11% free 2591K/2900K, paused 64ms+8ms, total 512ms
08-12 12:56:06.727: I/Process(1173): Sending signal. PID: 1173 SIG: 9
 

 

Label
Từ: 10:32 14/06/2012
Bài: 112
Cảm ơn: 124
Thích: 18

đường dẫn ctms đã thay đổi , bạn check lại link nhé http://ctms.fithou.net.vn/index.aspx

Label
Từ: 19:55 12/08/2013
Bài: 3
Cảm ơn: 3
Thích: 0

Chào buổi sáng ! 

bạn có thể giúp mình tí nhé :

trong trang này view-source:http://hcm.vieclam.24h.com.vn/tim-kiem-viec-lam-nhanh/?hdn_tu_khoa=&hdn_nganh_nghe_cap1=74&hdn_dia_diem=1&hdn_muc_luong=-1&hdn_cap_bac=-1&hdn_bang_cap=-1&hdn_kinh_nghiem=-1

 

mình muốn lây tất cả nội dung của thẻ <table width="100%" cellspacing="0" cellpadding="0" border="0">

thì evaluateXPath ghi thế nào vậy minh ghi vầy thì bị lỗi Object[] nodes = rootNode.evaluateXPath("//table[@width='100%' @cellspacing='0' @cellpadding='0' @border='0' ]");

MUCH THANKS

Label
Từ: 10:32 14/06/2012
Bài: 112
Cảm ơn: 124
Thích: 18

trước tiên bạn cần lấy thẻ <div class="group-3col"> -> nó sẽ trả về 3 thẻ div , bạn lấy thẻ đầu tiên nodes[0]

tiếp theo bạn lấy tất cả table trong nodes[0] -> trả về 2 table

bạn tìm trong 2 table này xem table nào có attr = cellspacing="0" cellpadding="0" border="0"

hoặc lấy luôn table số 2

 

Label
Từ: 19:55 12/08/2013
Bài: 3
Cảm ơn: 3
Thích: 0

à mình làm được rùi ! vừa nãy viết cái div sai vừa vào doc đọc :|  giờ mới để ý nó 

Object[] nodes = rootNode.evaluateXPath("//table[@cellspacing='0'][@width='100%'][@cellpadding='0'][@border='0']");

như vầy là trỏ thảng vào thẻ cần tìm luôn