2010-10-18 29 views
10

Tôi đang cố gắng loại bỏ một số thông tin từ một trang web nhưng không thể tìm thấy giải pháp phù hợp với tôi. Mỗi mã tôi đọc trên Internet tạo ra ít nhất một lỗi cho tôi.Gói Agility Html trợ giúp

Ngay cả mã mẫu tại trang chủ của họ cũng tạo ra lỗi cho tôi.

Mã của tôi:

  HtmlDocument doc = new HtmlDocument(); 
     doc.Load("https://www.flashback.org/u479804"); 
     foreach(HtmlNode link in doc.DocumentElement.SelectNodes("//a[@href"]) 
     { 
      HtmlAttribute att = link["href"]; 
      att.Value = FixLink(att); 
     } 
     doc.Save("file.htm"); 

Tạo các lỗi sau:

'HtmlDocument' là một tham chiếu mơ hồ giữa 'System.Windows.Forms.HtmlDocument' và 'HtmlAgilityPack.HtmlDocument' C: * \ Form1.cs

Edit: toàn bộ mã của tôi nằm ở đây: http://beta.yapaste.com/55

Tất cả trợ giúp đều được đánh giá cao!

+0

Như tôi đã đề cập trong phần trả lời của tôi bên dưới, tôi không thể thực sự nói những gì bạn đang cố gắng làm. Nếu bạn có thể mô tả công việc bạn đang cố gắng đạt được trong một số chi tiết hơn, tôi sẽ cố gắng giúp bạn viết một ứng dụng mẫu để đạt được nó. – rtpHarry

+0

Tôi nghĩ bạn có thể sử dụng "HtmlAgilityPack.HtmlDocument" thay vì "HtmlDocument" để đóng trình biên dịch. –

+0

Ah, đó là "sử dụng HtmlDocument = System.Windows.Forms.HtmlDocument;" bằng cách nào đó "kỳ diệu" đã được thêm vào mệnh đề sử dụng của tôi, điều này che khuất phiên bản HtmlAgilityPack của lớp HtmlDocument. –

Trả lời

9

Sử dụng HtmlAgilityPack.HtmlDocument:

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument(); 

Trình biên dịch là nhận nhầm lẫn vì hai trong số những không gian tên bạn đã nhập với using chứa lớp gọi HtmlDocument - namespace HTML Agility Pack, và Windows Forms namespace. Bạn có thể giải quyết vấn đề này bằng cách chỉ định lớp nào bạn muốn sử dụng một cách rõ ràng.

+0

Sau đó, tôi nhận được một lỗi khác: 'HtmlAgilityPack.HtmlDocument' không chứa định nghĩa cho 'DocumentElement' và không có phương pháp mở rộng 'DocumentElement' chấp nhận đối số đầu tiên của loại 'HtmlAgilityPack.HtmlDocument' có thể được tìm thấy (bạn đang thiếu chỉ thị sử dụng hoặc một tham chiếu lắp ráp?) –

+0

@Victor: Tôi không thực sự chắc chắn về bố cục chính xác của thư viện, nhưng tôi thấy mã ví dụ http://htmlagilitypack.codeplex.com/wikipage?title=Examples&referringTitle=Home. Từ bình luận ngay ở dưới cùng của trang đó, bạn có thể muốn thử 'DocumentNode' thay vì' DocumentElement'. Đó là một chút của một shot dài mặc dù ... –

+0

DocumentNode mang lại cho tôi nhiều lỗi hơn DocumentElement –

2

Các lớp học trong hai không gian tên System.Windows.FormsHtmlAgilityPack là mâu thuẫn. Sử dụng tên loại đủ điều kiện hoặc sử dụng bí danh không gian tên.

+0

Điều đó không giúp tôi quá nhiều, bạn có thể phát triển những gì tôi nên làm nhiều hơn một chút không? –

1

Tôi đã viết một vài bài viết giải thích cách sử dụng HtmlAgilityPack. Bạn có thể tìm thấy chúng hữu ích để bắt đầu:

CẢNH BÁO (2012/06/08): Liên kết này là một chút spam - tinh ranh pop-under quảng cáo, không có nhiều nội dung.

Tôi không biết liệu họ đã sửa chưa nhưng đoạn trích đó không được sử dụng để làm việc trên trang chủ của trang web, tôi cho rằng đó là từ phiên bản cũ của thư viện. Ngoài ra đoạn mã không định nghĩa FixLink() để nó không hoạt động ngay cả khi nó đúng cho thư viện.

Tôi khuyên bạn nên sử dụng phiên bản beta mới nhất của thư viện vì nó có các tiện ích mở rộng bổ sung để thực hiện các truy vấn LINQ chống lại nó và có thể giúp bạn tránh khỏi các truy vấn xpath khó hiểu sau này.

Tôi đã không nhìn thấy nó được sử dụng trong một ứng dụng Windows Forms trước nhưng có vẻ như bạn sẽ phải sử dụng loại tên đầy đủ điều kiện như:

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument(); 

Đối với các nhiệm vụ thực tế mà bạn đang cố gắng để thực hiện , có vẻ như bạn muốn lấy một url, tiêm một tên người dùng và id vào nó và sau đó ... không chắc chắn? Bạn trông giống như bạn đang cố gắng để lưu các tập tin ra đĩa và thiết lập mã html để các nội dung của một mẫu mà tôi không nghĩ rằng bạn có thể làm gì?

+0

@tomfanning - cảm ơn thông báo, có vẻ như một trong những tiện ích đã gửi spam cho người dùng. Tôi đã xóa các tiện ích PostRank và Blogged.com và tôi không thấy cửa sổ bật xuống spam nữa. – rtpHarry

5

đây là cách tôi đạt được. Lưu ý rằng có lỗi mã được cung cấp trong chính Html Agility Pack Example trong doc dòng foreach.DocumentElement.SelectNodes ("// a [@href"]). Chính xác và thử nghiệm được đưa ra dưới đây.

HtmlWeb hw = new HtmlWeb(); 

    HtmlDocument doc = hw.Load(@"http://tipscow.com"); 
    StringBuilder sb = new StringBuilder(); 

    List<string> lstHref = new List<string>(); 

    foreach (HtmlNode link in doc.DocumentNode.SelectNodes("//a[@href]").Distinct()) 
    { 
     string curHref = link.Attributes["href"].Value; 

     if(!lstHref.Contains(curHref)) 
     lstHref.Add(curHref); 

    } 
    foreach (string str in lstHref) 
    { 
     sb.Append(str +"<br />"); 
    } 

    Response.Write (sb.ToString()); 

Vì nó làm việc cho tôi, tôi nghĩ tôi nên chia sẻ.

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