C # 위키 페이지의 데이터 스크랩 (화면 스크래핑)

c# html-agility-pack screen screen-scraping

문제

나는 위키 페이지를 긁어 내고 싶다. 특히, 이 하나.

내 응용 프로그램은 사용자가 차량 등록 번호 (예 : SBS8988Z)를 입력 할 수있게하고 관련 정보 (페이지 자체에 있음)를 표시합니다.

예를 들어 사용자가 응용 프로그램의 텍스트 필드에 SBS8988Z을 입력하면 해당 위키 페이지의 행을 찾습니다

SBS8988Z (SLBP 192/194*) - F&N NutriSoy Fresh Milk: Singapore's No. 1 Soya Milk! (2nd Gen)

돌아 오는 SBS8988Z (SLBP 192 / 194 *) - F & N NutriSoy Fresh Milk : 싱가포르의 1 번 콩 우유! (2 세대).

내 코드는 지금까지 (복사 및 다양한 웹 사이트에서 편집) ...

WebClient getdeployment = new WebClient();
string url = "http://sgwiki.com/wiki/Scania_K230UB_(Batch_1_Euro_V)";

getdeployment.Headers["User-Agent"] = "NextBusApp/GetBusData UserAgent";
string sgwikiresult = getdeployment.DownloadString(url); // <<< EXCEPTION
MessageBox.Show(sgwikiresult); //for debugging only!

HtmlAgilityPack.HtmlDocument sgwikihtml = new HtmlAgilityPack.HtmlDocument();
sgwikihtml.Load(new StreamReader(sgwikiresult));
HtmlNode root = sgwikihtml.DocumentNode;

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

foreach(HtmlNode deployment in root.SelectNodes("SBS8988Z"))
{
    string att = deployment.OuterHtml;
    anchorTags.Add(att);
}

그러나 ArgumentException 처리되지 않은 받고 있어요 - 경로에 잘못된 문자입니다.

코드에 어떤 문제가 있습니까? 이 작업을 수행하는 더 쉬운 방법이 있습니까? HtmlAgilityPack을 사용하고 있지만 더 나은 솔루션이 있다면 준수하는 것이 좋을 것입니다.

수락 된 답변

코드에 어떤 문제가 있습니까? 무디게, 모든 것. :피

페이지는 사용자가 읽는 방식대로 포맷되지 않습니다. 그런 식으로 원하는 콘텐츠를 얻을 수는 없습니다.

페이지의 내용 (우리가 관심을 갖는 부분)은 다음과 같이 보입니다.

<h2>
<span id="Deployments" class="mw-headline">Deployments</span>
</h2>
<p>
    <!-- ... -->
    <b>SBS8987B</b>
    (SLBP 192/194*)
    <br>
    <b>SBS8988Z</b>
    (SLBP 192/194*) - F&amp;N NutriSoy Fresh Milk: Singapore's No. 1 Soya Milk! (2nd Gen)
    <br>
    <b>SBS8989X</b>
    (SLBP SP)
    <br>
    <!-- ... -->
</p>

기본적으로 우리는 찾고있는 등록 번호를 포함하는 b 요소를 찾아야합니다. 해당 요소를 찾으면 텍스트를 가져 와서 함께 묶어서 결과를 만듭니다. 여기 코드에 있습니다 :

static string GetVehicleInfo(string reg)
{
    var url = "http://sgwiki.com/wiki/Scania_K230UB_%28Batch_1_Euro_V%29";

    // HtmlWeb is a helper class to get pages from the web
    var web = new HtmlAgilityPack.HtmlWeb();

    // Create an HtmlDocument from the contents found at given url
    var doc = web.Load(url);

    // Create an XPath to find the `b` elements which contain the registration numbers
    var xpath = "//h2[span/@id='Deployments']" // find the `h2` element that has a span with the id, 'Deployments' (the header)
              + "/following-sibling::p[1]"     // move to the first `p` element (where the actual content is in) after the header
              + "/b";                          // select the `b` elements

    // Get the elements from the specified XPath
    var deployments = doc.DocumentNode.SelectNodes(xpath);

    // Create a LINQ query to find the  requested registration number and generate a result
    var query =
        from b in deployments                 // from the list of registration numbers
        where b.InnerText == reg              // find the registration we're looking for
        select reg + b.NextSibling.InnerText; // and create the result combining the registration number with the description (the text following the `b` element)

    // The query should yield exactly one result (or we have a problem) or none (null)
    var content = query.SingleOrDefault();

    // Decode the content (to convert stuff like "&amp;" to "&")
    var decoded = System.Net.WebUtility.HtmlDecode(content);

    return decoded;
}


아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.