2013-03-14 6 views
1

[Этот вопрос имеет относительно, который живет по адресу: Selective screen scraping with HTMLAgilityPack and XPath]экран соскоб с htmlAgilityPack и XPath

У меня есть некоторые HTML для синтаксического анализа, который имеет общий вид, как следующие:

... 
<tr> 
<td><a href="" title="">Text Data here (1)</a></td> 
<td>Text Data here(2)</td> 
<td>Text Data here(3)</td> 
<td>Text Data here(4)</td> 
<td>Text Data here(5)</td> 
<td>Text Data here(6)</td> 
<td><a href="link here {1}" class="image"><img alt="" src="" /></a></td> 
</tr> 
<tr> 
<td><a href="" title="">Text Data here (1)</a></td> 
<td>Text Data here(2)</td> 
<td>Text Data here(3)</td> 
<td>Text Data here(4)</td> 
<td>Text Data here(5)</td> 
<td>Text Data here(6)</td> 
<td><a href="link here {1}" class="image"><img alt="" src="" /></a></td> 
</tr> 
... 

Ищу для способ, где я могу разобрать его вниз в содержательных куски, как это:

(1), (2), (3), (4), (5), (6), {1} CRLF
(1) , (2), (3), (4), (5), (6), {1} CRLF
и так далее

Я попробовал два способа:
путь 1:

var dataList = currentDoc.DocumentNode.Descendants("tr") 
       .Select 
       (
        tr => tr.Descendants("td").Select(td => td.InnerText).ToList() 
       ).ToList(); 

который извлекает мне внутренний текст td с, но не может принести ссылку {1}. Здесь создается список, содержащий множество списков. Я могу управлять им, используя вложенный foreach.

путь 2:

var dataList = currentDoc.DocumentNode 
       .SelectNodes("//tr//td//text()|//tr//td//a//@href"); 

, который действительно получает мне ссылку {1} ​​и все данные, но она становится неорганизованным. Здесь все данные присутствуют в большом фрагменте. Поскольку данные в одном tr относительны, я теперь теряю это отношение.

Итак, как я могу решить эту проблему?

+0

Данные (x) в TD и данные {x} в HREF отличаются друг от друга, поэтому для его получения требуется два кода. Что вам нужно в точности? –

ответ

0

Следующий запрос выбирает элемент a с непустым атрибутом href из каждой ячейки. Если нет такого элемента, то внутренний текст ячейки используются:

var dataList = 
    currentDoc.DocumentNode.Descendants("tr") 
       .Select(tr => from td in tr.Descendants("td") 
          let a = td.SelectSingleNode("a[@href!='']") 
          select a == null ? td.InnerText : 
               a.Attributes["href"].Value); 

Не стесняйтесь добавлять ToList() звонков.

+0

'var dataList = currentDoc.DocumentNode.Descendants (" tr ") . Выберите (tr => from td in tr.Descendants (" td ") let a = td.SelectSingleNode (" a [начинает с (@ class, 'image')] ") select a == null? td.InnerText: a.Attributes [" href "]. Value);' делает это. Это причудливо. Но работает. Благодарю. – 2013-03-14 11:58:04

+0

любая идея, если бы я хотел выборочно отбирать данные? http://stackoverflow.com/questions/15404839/selective-screen-scraping-with-htmlagilitypack-and-xpath – 2013-03-14 11:59:28

+0

@AnubhavSaini держись, я проверю –