2011-01-03 23 views
12

Tôi đã được giao nhiệm vụ trong công việc cạo màn hình một trong các ứng dụng web cũ của chúng tôi để trích xuất một số dữ liệu nhất định từ mã. Dữ liệu được định dạng và "phải" được hiển thị chính xác giống nhau mọi lúc. Tôi chỉ không chắc chắn làm thế nào để đi về việc này. Đó là một tệp html đầy đủ với các điều hướng đầu trang và chân trang nhưng ở giữa tất cả điều này là dữ liệu tôi cần.Màn hình Cọc HTML với C#

tôi cần phải trích xuất các giá trị tên công ty, Tên người liên hệ, điện thoại, địa chỉ email, vv

Dưới đây là một ví dụ về những gì mã trông giống như:

...html above here 

<br /><br /> 
<table cellpadding="0" cellspacing="12" border="0"> 
    <tr> 
     <td valign="top" align="center"> 
      <!-- Company Info --> 

      <table cellpadding="0" cellspacing="0" border="0"> 
       <tr> 
        <td class="black"> 
         <table cellspacing="1" cellpadding="0" border="0" width="370"> 
          <tr> 
           <th>ABC INDUSTRIES</th> 
          </tr> 
          <tr> 
           <td class="search"> 

            <table cellpadding="5" cellspacing="0" border="0" width="100%"> 
             <tr> 
              <td> 
               <table cellpadding="1" cellspacing="0" border="0" width="100%"> 
                <tr> 
                 <td align="center" colspan="2"><hr></td> 
                </tr> 
                <tr> 
                 <td align="right" nowrap><b><font color="FF0000">Contact Person&nbsp;<img src="/images/icon_contact.gif" align="absmiddle">&nbsp;:</font></b></td> 
                 <td align="left" width="100%">&nbsp;Joe Smith</td> 
                </tr> 
                <tr> 
                 <td align="right" nowrap><b><font color="FF0000">Phone Number&nbsp;<img src="/images/icon_phone.gif" align="absmiddle">&nbsp;:</font></b></td> 
                 <td align="left" width="100%">&nbsp;555-555-5555</td> 
                </tr> 
                <tr> 
                 <td align="right" nowrap><b><font color="FF0000">E-mail Address&nbsp;<img src="/images/icon_email.gif" align="absmiddle">&nbsp;:</font></b></td> 
                 <td align="left" width="100%">&nbsp;<a HREF="mailto:[email protected]">[email protected]</a></td> 
                </tr> 
                more... 

Có là mã thêm về màn hình trong một cấu trúc bảng khác nhau mà tôi cũng cần phải kéo.

+0

Nếu HTML là XML được định dạng tốt, sẽ khá dễ dàng để thả văn bản vào tài liệu XML và nhận các phần bạn cần với XPath hoặc XSL. – Juliet

Trả lời

23

Bạn chỉ đang tìm kiếm các đề xuất về cách thực hiện việc này? Các HTML Agility Pack có lẽ sẽ là đặt cược tốt nhất của bạn cho phân tích cú pháp DOM nói chung. Có thể có một chút tinkering và thử nghiệm và lỗi để duy trì màn hình của bạn cạo (thường có cho rằng loại điều), nhưng thư viện đó là khá tốt cho phân tích HTML. Về mặt kỹ thuật, mọi phân tích cú pháp XML (thậm chí là LINQ thành XML) nên thực hiện thủ thuật, nhưng các trang web có thói quen khó chịu không được hình thành tốt để bạn có thể gặp phải những cơn đau đầu nhỏ ở đây và ở đó.

+2

A +1 trên Gói nhanh nhẹn HTML. Tôi lãng phí hàng tá giờ cố gắng sử dụng các lớp xml trong. Net để phân tích cú pháp html được tạo thành (nghĩa là hầu hết html trong thế giới thực) trước khi thử gói HTML nhanh nhẹn. Có kết quả tôi cần trong 1/10 thời gian. Ước gì tôi đã biết về HTML Agility ngay từ đầu. –

-1

Nếu bạn có HTML được lưu trữ trong một chuỗi, bạn có thể luôn luôn sử dụng Regular Expressions với nhóm chụp để phân tích các thông tin bạn cần.

+1

http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags –

+1

Cảm ơn vì điều đó, tôi chắc chắn sẽ không bao giờ đề xuất một lần nữa lol –

1

Trong các dự án gần đây, tôi đã sử dụng thành công WebRequest và được phân loại có liên quan để tải xuống HTML từ một URL và sau đó phân tích cú pháp để thực sự có quyền truy cập vào nội dung có cấu trúc.

1

Nếu nhận xét trang và mã bố cục bảng giống nhau bất cứ khi nào được gọi, tôi sẽ kéo trang vào chuỗi và sử dụng một loạt các hàm .IndexOf và .Substring để phân tích dữ liệu. Sử dụng hàm IndexOf để tìm chỉ mục bắt đầu và kết thúc của từng trường. Sử dụng các chỉ mục trường này trong hàm Substring để lấy dữ liệu.

Nó không đẹp nhưng hoàn thành công việc.

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