나는 xpath를 사용하는 법을 배우기 위해 XML 문서를 순회하는 중이다.
나는 문제를 우연히 발견했다. 매 xpath를 실행하려고 할 때마다 아무것도 찾지 못한 것처럼 null
을 반환합니다. XMLQuire에서 xpath를 시도해 보았습니다.
class Program
{
private static string URL = "https://www.kijiji.ca/b-renovation-contracting-handyman/ontario/home-renovations/k0c753l9004";
private static HtmlWeb client = new HtmlWeb();
static void Main(string[] args)
{
var DOM = client.Load(URL); // //table/tbody/tr/td[@class = 'description']/p
var Featured = DOM.DocumentNode.SelectNodes("//table[contains(@class,'top-feature')]/tbody/tr/td/a");
foreach (var Listing in Featured)
{
}
}
}
나는 내가 시도한 다른 xpath를 주석 처리했다, 나는 그 두 가지를 시도해 보았고 둘 다 null
왜 그런가?
다음은 액세스하려는 DOM의 일부를 보여주는 이미지입니다.
<table class="top-feature js-hover" data-ad-id="1299717863" data-vip-url="/v-renovation-contracting-handyman/sudbury/c-l-contracting-any-job-big-or-small/1299717863">
<tbody><tr>
<td class="watchlist">
<div class="watch js-hover p-vap-lnk-actn-addwtch" data-action="add" data-adid="1299717863" title="Click to add to My Favourites"><div class="icon"></div></div>
<input id="watchlistXsrf" name="ca.kijiji.xsrf.token" value="1527418405414.9b71d1309fdd8a315258ea5a3dac1a09e4a99ec7f32041df88307c46e26a5b1b" type="hidden">
</td>
<td class="image">
<div class="multiple-images"><img src="https://i.ebayimg.com/00/s/NjAwWDgwMA==/z/fXEAAOSwaZdZxTv~/$_2.JPG" alt="C.L. Contracting. Any job big or small."></div>
</td>
<td class="description">
<a href="/v-renovation-contracting-handyman/sudbury/c-l-contracting-any-job-big-or-small/1299717863" class="title ">
C.L. Contracting. Any job big or small.</a>
<p>
Contractor handyman home renovations and repairs. Contractor for Dollarama, Rexall, LaSenza and more. Fully licensed and insured. Able to do drywall, decks, framing, plumbing, flooring windows, ...</p>
<p class="details">
</p>
</td>
<td class="posted">
</td>
</tr>
</tbody></table>
내 솔루션 (루프를 무리로 통과하는 대신 한 줄로 내 xpath 만들기 도움이 필요합니다.)
private static string URL = "https://www.kijiji.ca/b-renovation-contracting-handyman/ontario/home-renovations/k0c753l9004";
private static HtmlWeb client = new HtmlWeb();
static void Main(string[] args)
{
var DOM = client.Load(URL); // //table/tbody/tr/td[@class = 'description']/p
var Featured = DOM.DocumentNode.SelectNodes("//table[contains(@class,'top-feature')]/tbody/tr/td/a");
foreach (var table in DOM.DocumentNode.SelectNodes("//table[contains(@class, 'top-feature')]"))
{
Console.WriteLine($"Found: {table}");
foreach (var rows in table.SelectNodes("tr"))
{
Console.WriteLine(rows);
foreach (var cell in rows.SelectNodes("td[@class='description']/a"))
{
Console.WriteLine(cell.InnerText.Trim());
}
}
}
Console.ReadKey();
나는 그것을 해결할 수 있었지만, 왜이 xpath가 작동하는지 궁금 할 때까지
//table[contains(@class, 'top-feature')]/tr/td[@class='description']/a
그리고 이것은 하나도 아닙니다. //table[contains(@class,'top-feature')]/tbody/tr/td/a
주석에서 언급했듯이 <tbody>
요소는 브라우저 개발자 도구에 의해 생성됩니다.
디버거를 사용하여 런타임 중에 var DOM
객체를 보면 InnerHtml
속성을 볼 수 있습니다.
<table class="regular-ad js-hover" data-ad-id=".." data-vip-url="..">
<tr>
<td class="watchlist">
...
</td>
<td class="image">
...
</td>
...
</tr>
</table>
<tbody>
요소가 없으므로 XPath는 다음과 같이 표시되어야합니다.
DOM.DocumentNode.SelectNodes("//table[contains(@class,'top-feature')]/tr/td/a");