2013-05-18 27 views
5

Tôi đang sử dụng R để xóa các liên kết khỏi bảng chính trên that page, sử dụng cú pháp XPath. Bảng chính là thứ ba trên trang và tôi chỉ muốn các liên kết có chứa bài viết trên tạp chí.R: Biểu thức XPath trả về các liên kết bên ngoài phần tử đã chọn

Mã của tôi sau:

require(XML) 
(x = htmlParse("http://www.numerama.com/magazine/recherche/125/hadopi/date")) 
(y = xpathApply(x, "//table")[[3]]) 
(z = xpathApply(y, "//table//a[contains(@href,'/magazine/') and not(contains(@href, '/recherche/'))]/@href")) 
(links = unique(z)) 

Nếu bạn nhìn vào đầu ra, các liên kết chính thức không đến từ bảng chính nhưng từ thanh bên, mặc dù tôi chọn bảng chính ở dòng thứ ba của tôi bằng cách hỏi đối tượng y để chỉ bao gồm bảng thứ ba.

Tôi đang làm gì sai? Cách chính xác/hiệu quả hơn để viết mã này với XPath là gì?

Lưu ý: XPath viết mới làm quen.

Đã trả lời (thực sự nhanh chóng), cảm ơn rất nhiều! Giải pháp của tôi là dưới đây.

extract <- function(x) { 
    message(x) 
    html = htmlParse(paste0("http://www.numerama.com/magazine/recherche/", x, "/hadopi/date")) 
    html = xpathApply(html, "//table")[[3]] 
    html = xpathApply(html, ".//a[contains(@href,'/magazine/') and not(contains(@href, '/recherche/'))]/@href") 
    html = gsub("#ac_newscomment", "", html) 
    html = unique(html) 
} 

d = lapply(1:125, extract) 
d = unlist(d) 
write.table(d, "numerama.hadopi.news.txt", row.names = FALSE) 

Điều này tiết kiệm tất cả liên kết đến các mục tin tức có từ khóa 'Hadopi' trên trang web này.

Trả lời

3

Bạn cần bắt đầu mẫu bằng . nếu bạn muốn giới hạn tìm kiếm đối với nút hiện tại. / quay lại phần đầu của tài liệu (ngay cả khi nút gốc không ở trong y).

xpathSApply(y, ".//a/@href") 

Ngoài ra, bạn có thể trích xuất bảng thứ ba trực tiếp với XPath:

xpathApply(x, "//table[3]//a[contains(@href,'/magazine/') and not(contains(@href, '/recherche/'))]/@href") 
+1

Đó làm việc, câu hỏi chỉnh sửa để phản ánh câu trả lời. Cảm ơn! –

Các vấn đề liên quan