2014-10-29 1 views
0

Я спросил об этом раньше, но я хотел перефразировать вопрос. Я пытаюсь сделать скребок для моего проекта. Я хотел бы, чтобы он отображал определенную часть ссылки. Единственная часть ссылки, которая изменяется, - это номер. Этот номер - это то, что я хотел бы соскрести. Ссылка выглядит так:awesomium web scraping некоторые части

<a href="/link/player.jsp?user=966354" target="_parent" "=""> 

Как уже упоминалось, я пытаюсь отрезать только часть 966354 ссылки. Я попробовал несколько способов сделать это, но не могу понять это. Когда я добавляю

<a href="/link/player.jsp?user="   

к коду ниже он нарушает

List<string> player = new List<string>(); 
string html = webControl2.ExecuteJavascriptWithResult("document.getElementsByTagName('a')[0].innerHTML"); 
MatchCollection m1 = Regex.Matches(html, "<a href=\\s*(.+?)\\s*</a>", RegexOptions.Singleline); 
foreach (Match m in m1) 
{ 
    string players = m.Groups[1].Value; 
    player.Add(players); 
} 
    listBox.DataSource = player; 

Так что я удалил его, он не показывает никаких ошибок пока я иду, чтобы запустить программу, то я получаю эту ошибку:

" Необработанное исключение типа «System.InvalidOperationException» произошло в Awesomium.Windows.Forms.dll «

Итак, я пробовал это, и он кое-что работает:

string html = webControl2.ExecuteJavascriptWithResult("document.getElementsByTagName('html')[0].innerHTML");  

Этот код обрывается, но не так, как хотелось бы. Может кто-нибудь протянет руку помощи, пожалуйста.

ответ

1

Я бы использовал HtmlAgilityPack (установите его через NuGet) и запросы XPath для анализа HTML.

Что-то вроде этого:

string html = webControl2.ExecuteJavascriptWithResult("document.getElementsByTagName('html')[0].innerHTML"); 
var htmlDoc = new HtmlAgilityPack.HtmlDocument(); 
htmlDoc.LoadHtml(html); 

var playerIds = new List<string>(); 

var playerNodes = htmlDoc.DocumentNode.SelectNodes("//a[contains(@href, '/link/profile-view.jsp?user=')]"); 

if (playerNodes != null) 
{ 
    foreach (var playerNode in playerNodes) 
    { 
     string href = playerNode.Attributes["href"].Value; 

     var parts = href.Split(new char[] { '=' }, StringSplitOptions.RemoveEmptyEntries); 
     if (parts.Length > 1) 
     { 
      playerIds.Add(parts[1]); 
     } 
    } 

    id.DataSource = playerIds; 
} 

Кроме того, вы можете найти эти две простые вспомогательные классы полезны: https://gist.github.com/AlexP11223/8286153

Первый extension methods для WebView/WebControl и второй из них имеет некоторые статические методы для генерации JS-код для извлечения элементов (JSObject) XPath + получение координат JSObject)

+0

Спасибо, что очень помогли. – David

+0

Редактировать, он просто разбился с помощью error: NullReferenceException был необработанным, указывая на foreach – David

+0

playerNodes будет null, если нет подходящих элементов. Поэтому вы можете проверить его, если вы иногда выполняете его на страницах без этих элементов. – AlexP11223

0

Используя пример html-файла, например, ниже, я не смог дублировать исключение.

<html> 
<a href="/link/player.jsp?user=966354" target="_parent" "="">test</a> 
</html> 

Однако Javascript

document.getElementsByTagName('a')[0].innerHTML 

вернется "тест" в моем примере. Что вы, вероятно, хотите, это

document.getElementsByTagName('a')[0].href 

, который вернет часть href.

Свойство «innerHTML» будет возвращать все между стартовыми и конечными тегами (например, < html> </html>). Вероятно, это причина того, что вы получили лучший успех при получении элемента «html» - в итоге вы разобрали всю ссылку < a> </a>.

FYI, в качестве теста вы можете использовать свой браузер, чтобы проверить выход javascript.

+0

Я уже пробовал это тоже. Он тянет ссылку, но неверный также тянет всю ссылку, чего я не хочу. единственная часть, которую я хочу очистить, это цифры «966354», а не вся ссылка. Но спасибо за ваш ответ. – David

+0

Ну, вам нужно будет каким-то образом идентифицировать ссылку из других ссылок на странице (в идеале по идентификатору, но это не похоже на ваш пример, возможно, наличие «target =» _ parent », атрибут После того, как правильная ссылка получена, простое выражение регулярного выражения для разбора бит после части «user =» ссылки. – Pickett

 Смежные вопросы

  • Нет связанных вопросов^_^