1

私は小さなプログラムを作成してC#を学んでいますが、同様の投稿が見つかりませんでした(この回答が別の場所に投稿されている場合はお詫びします)。

PDFへのリンク(指定した場所にダウンロードできます)のWebサイトをスクリーンスクレイピングするにはどうすればよいですか?ページに実際のPDFリンクがある別のHTMLページへのリンクがある場合があるため、最初のページで実際のPDFが見つからない場合は、「PDF」が含まれるリンクを自動的に検索するようにします。リンクのテキストを入力し、その結果のHTMLページで実際のPDFリンクを検索します。

グーグルでファイルタイプを検索することでおそらく似たようなことを達成できることは知っていますが、それは私には「ごまかし」のようです:)コードでそれを行う方法を学びたいのですが、どこから始めればよいかわかりません。XElementなどを使用したXML解析には少し慣れていますが、HTMLページ(または他の形式)からリンクを取得する方法がわかりません。

誰かが私を正しい方向に向けることができますか?ありがとう!

4

3 に答える 3

4

HtmlAgilityPackは、この種のものに最適です。

実装例:

string pdfLinksUrl = "http://www.google.com/search?q=filetype%3Apdf";

// Load HTML content    
var webGet = new HtmlAgilityPack.HtmlWeb();
var doc = webGet.Load(pdfLinksUrl);

// select all <A> nodes from the document using XPath
// (unfortunately we can't select attribute nodes directly as
// it is not yet supported by HAP)
var linkNodes = doc.DocumentNode.SelectNodes("//a[@href]");

// select all href attribute values ending with '.pdf' (case-insensitive)
var pdfUrls = from linkNode in linkNodes
    let href = linkNode.Attributes["href"].Value
    where href.ToLower().EndsWith(".pdf")
    select href;

// write all PDF links to file
System.IO.File.WriteAllLines(@"c:\pdflinks.txt", pdfUrls.ToArray());

ちなみに、HAPのXPath式にはあまり依存しません。いくつかのXPath関数が欠落しており、すべての抽出ロジックをXPath内に配置すると、コードの保守性が低下します。XPath式を使用してかなりの最小値を抽出し、ノードコレクションを反復処理して必要なすべての抽出を実行します(Linqメソッドは非常に役立ちます)。

HAPの真の力は、SGMLドキュメントを解析する機能です。つまり、XHTMLの観点からは無効になる可能性があります(閉じられていないタグ、引用符の欠落など)。

于 2011-03-11T23:17:14.197 に答える
0

最善の策は、おそらくHTML Agilityを使用してページをスクリーンスクレイピングし、href属性を選択してPDFダウンロードのように見えるかどうかを確認することです。そうでない場合は、ノード内のテキストでPDFなどのキーワードを探して、リンクをたどるかどうかを判断できます。

于 2011-03-11T23:15:19.613 に答える
0

HTMLページの解析には、HtmlAgilityPackを使用します。それは最高です。

それから、任意のHTM1ページをXMLに変換し、HTMLよりもはるかに簡単に検索できます。

情報を得るためにサイトをクロールする必要がある場合は、NCrawlerを参照してください。

于 2011-03-11T23:15:40.223 に答える