2012-05-19 32 views
5

Điều tôi đang làm là cơ bản giống như nút Tweet hoặc nút Chia sẻ/Thích Facebook, và đó là để xóa một trang và nhiều nhất tiêu đề có liên quan cho một phần dữ liệu. Ví dụ tốt nhất tôi có thể nghĩ đến là khi bạn đang ở trên trang đầu của một trang web có nhiều bài viết và bạn nhấp vào nút Thích trên Facebook. Sau đó nó sẽ nhận được thông tin thích hợp cho bài đăng tương đối với nút Like (gần nhất). Một số trang web có thẻ Open Graph, nhưng một số thì không và nó vẫn hoạt động.Điều khiển từ xa và lấy tiêu đề phù hợp nhất hoặc mô tả cho hình ảnh với XPath

Vì điều này được thực hiện từ xa, tôi chỉ có quyền kiểm soát dữ liệu mà tôi muốn nhắm mục tiêu. Trong trường hợp này dữ liệu là hình ảnh. Thay vì chỉ truy xuất <title> của trang, tôi đang tìm cách bằng cách nào đó đi ngang qua mái vòm ngược lại từ điểm bắt đầu của mỗi hình ảnh và tìm "tiêu đề" gần nhất. Vấn đề là không phải tất cả các tiêu đề đều xuất hiện trước một hình ảnh. Tuy nhiên, cơ hội của hình ảnh xảy ra sau khi tiêu đề trong trường hợp này có vẻ khá cao. Với điều đó đã nói, đó là hy vọng của tôi để làm cho nó hoạt động tốt cho gần như bất kỳ trang web.

Suy nghĩ:

  • Tìm "container" của hình ảnh và sau đó sử dụng khối đầu tiên của văn bản.
  • Tìm các khối văn bản trong các thành phần chứa các lớp nhất định ("mô tả", "tiêu đề") hoặc các phần tử (h1, h2, h3, h4).

sao lưu Title:

  • Sử dụng mở Graph Thẻ
  • Sử dụng chỉ là <title>
  • Sử dụng thẻ ALT chỉ
  • Sử dụng Tags META

Tóm tắt: Trích xuất hình ảnh không phải là vấn đề, đó là cách để có được các tiêu đề liên quan cho họ.

Câu hỏi: Bạn sẽ nhận được các tiêu đề liên quan cho từng hình ảnh như thế nào? Có lẽ sử dụng DomDocument hoặc XPath?

+0

Thành thực mà nói, sau khi bạn cạo nó với PHP, nếu bạn có thể chuyển nó qua các cuộc gọi REST tới một máy chủ Web Java nhỏ, bạn có thể sử dụng JSOUP để dễ dàng truy cập vào tất cả các phần tử và các thuộc tính đó. JSOUP giống như jQuery cho Java và sử dụng nhiều cú pháp giống nhau. Tôi muốn nó có sẵn cho PHP vì nó sẽ làm cho vấn đề của bạn biến mất trong vài giây! – jmort253

+0

có một số thư viện có sẵn để xử lý việc trích xuất nội dung từ các trang, mặc dù tôi không biết một trong số đó có giao dịch trực tiếp với hình ảnh. nhưng bạn có thể nhận được một số ý tưởng và chỉ đường hoặc có thể sử dụng chúng. đây là một: http://code.google.com/p/boilerpipe/wiki/Components –

+1

Cảm ơn những suy nghĩ của bạn.Tôi đã cập nhật câu hỏi của mình để nhắm mục tiêu nhiều hơn "logic" đằng sau việc nhận tiêu đề hoặc mô tả có liên quan cho mỗi hình ảnh thay vì cách tự tải hình ảnh. – stwhite

Trả lời

1

Cách tiếp cận của bạn có vẻ đủ tốt, tôi chỉ cung cấp một số thẻ/thuộc tính trọng số và lặp lại chúng với các truy vấn XPath cho đến khi tôi tìm thấy thứ gì đó thoát ra và nó không có giá trị. Một cái gì đó như:

i = 0 

while (//img[i][@src]) 
    if (//img[i][@alt]) 
    return alt 
    else if (//img[i][@description]) 
    return description 
    else if (//img[i]/../p[0]) 
    return p 
    else 
    return (//title) 

    i++ 

Một ví dụ XPath đơn giản (chức năng ported from my framework):

function ph_DOM($html, $xpath = null) 
{ 
    if (is_object($html) === true) 
    { 
     if (isset($xpath) === true) 
     { 
      $html = $html->xpath($xpath); 
     } 

     return $html; 
    } 

    else if (is_string($html) === true) 
    { 
     $dom = new DOMDocument(); 

     if (libxml_use_internal_errors(true) === true) 
     { 
      libxml_clear_errors(); 
     } 

     if ($dom->loadHTML(ph()->Text->Unicode->mb_html_entities($html)) === true) 
     { 
      return ph_DOM(simplexml_import_dom($dom), $xpath); 
     } 
    } 

    return false; 
} 

Và việc sử dụng thực tế:

$html = file_get_contents('http://en.wikipedia.org/wiki/Photography'); 

print_r(ph_DOM($html, '//img')); // gets all images 
print_r(ph_DOM($html, '//img[@src]')); // gets all images that have a src 
print_r(ph_DOM($html, '//img[@src]/..')); // gets all images that have a src and their parent element 
print_r(ph_DOM($html, '//img[@src]/../..')); // and so on... 
print_r(ph_DOM($html, '//title')); // get the title of the page 
+0

Tôi đã đọc về XPath và thực sự bắt đầu thử nghiệm một số tùy chọn, nhưng bạn có thể mở rộng về điều này không? Tìm khoảng cách giữa các nút có vẻ như là một ý tưởng tốt để làm, tuy nhiên tôi chưa đưa ra một giải pháp nào. – stwhite

+0

@stwhite: Trên thực tế đó không phải là ý tưởng của tôi, bạn chỉ cần bắt đầu ở mức độ đặc trưng cao nhất ('img' tag) và làm việc theo cách của bạn, cho đến khi bạn tìm thấy một cái gì đó mà bạn muốn xem xét như mô tả. –

+0

Tôi nhận ra đây không phải là ý tưởng ban đầu của bạn, nhưng bạn có ý tưởng nào về cách lấy khoảng cách giữa các nút tìm thấy không? Ví dụ: tìm vị trí của hình ảnh hiện tại với H1 trước đó so với khoảng cách từ hình ảnh đến h2 trước đó. Điều này dường như cung cấp cho một số điểm trong đó có nhiều khả năng là một tiêu đề "tốt hơn". Về cơ bản nó sẽ thực sự là về cái nào đến trước hoặc gần hơn với hình ảnh. – stwhite

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