webClient.DownloadString() omija fragmenty źródła strony

0

Witam. Napotkałem problem z którego rozwiązaniem mam trudności już od dłuższego czasu.

Parsuje stronę korzystając z:

WebClient webClient = new WebClient();
string str = webClient.DownloadString("link"); 

Wynik niestety pomija fragment kodu źródłowego, który przedstawia się następująco:

<div id="ctl00_ctl00_CPContent_CPMain_updBid">
<div class="alert">
<div class="float_left">
<strong>tekst</strong>&nbsp;&nbsp;
<input type="image" name="ctl00$ctl00$CPContent$CPMain$lnkRefresh" id="ctl00_ctl00_CPContent_CPMain_lnkRefresh" title="Odśwież" src="/Img/icons/arrow_refresh.png" onclick="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(&quot;ctl00$ctl00$CPContent$CPMain$lnkRefresh&quot;, &quot;&quot;, true, &quot;&quot;, &quot;&quot;, false, false))" style="border-width:0px;" />
</div>
<div class="float_right">
<a href='/Club/Transfers/?actionType=hotList&transferID=312681051'>
<img src="/Img/Icons/transparent.gif" alt="Obserwuj" title="Obserwuj" class="hotlist" /></a>
<a href="/Myaccount/Reminders/?sendDate=2016-04-05+05%3a46%3a00&amp;reminderText=Muhidin+%c5%a0araba+(413482347)%0d%0aTermin%3a+05.04.2016+05%3a56">
<img src="/Img/Icons/transparent.gif" alt="Przypomnienia" title="Przypomnienia" class="reminder" />
</a>
</div>
<br class="clear" />
<p>Termin:&nbsp;05.04.2016 05:56</p>
<p>Cena wywoławcza:&nbsp;2 400 000&nbsp;zł</p>
<div id="ctl00_ctl00_CPContent_CPMain_pnlLoyaltyInfo" class="subtle>Tekst</div>

Te informacje są dostępne z poziomu przeglądarki/źródło_strony, lecz po użyciu DownloadString() są pomijane. Z góry dziekuje za wszelkie sugestie.

0

Nie podałeś adresu strony, ale wygląda to że strona się "dogrywa" przez JS / AJAX.

0

Tak. Ten element, który jest omijany jest oparty na JS/Ajax, ale skoro te dane są dostępne w źródle strony z poziomu przeglądarki to zakładam że można je w jakiś sposób sparsować.

0

Jak zapiszę ręcznie źródło strony z poziomu przeglądarki to w notatniku mam pełny zapis bez pomijania tych elementów.

Podejrzewam że chodzi o różnice w stylu "Strona WWW, kompletna"/"Strona WWW, tylko HTML".

0

Są różne sposoby, najłatwiej to chyba użyć Selenium, które będzie udawać prawdziwą przeglądarkę.

0

A nie ma jakiejś prostszej metody? Zakładam że muszę w jakiś sposób skonfigurować WebClient czy też zastosowac jakąs inną klasę.

0

Można próbować odpalić kod JS w swojej aplikacji, ale nie wiem jak to się robi :(

0

A może ktoś z was wie jak obsługiwać to Selenium? Moim celem jest tylko przechwycenie danych ze źródła, a on zapisuje wszystkie moje operacje wykonywane w przeglądarce.

1

WebClient to nie jest przeglądarka, nie uruchomi ci JS. Jak korzystasz z Wpf/WinFormsów to możesz użyć kontrolki WebBrowser.

0

Czytałem, że zamiast Selenium można użyć np. HtmlUnit czy envjs (ponoć prostsze)

Tu jest "cosik" jak odpalić kod JS z poziomu C#:

http://stackoverflow.com/questions/4744105/parse-and-execute-js-by-c-sharp

Tak jak kolega podpowiedział, chyba WebBrowser będzie najlepszy bo to jest na silniku IE (czy już Edge?) i wtedy masz dostęp do kodu w pełnej postaci (strona www "myśli" że ją przeglądasz z poziomu IE).

0
DibbyDum napisał(a):

WebClient to nie jest przeglądarka, nie uruchomi ci JS. Jak korzystasz z Wpf/WinFormsów to możesz użyć kontrolki WebBrowser.

Cześć. Poszedłem za Twoją radą i skonstruowałem coś takiego:

textBox1 do wpisywania adresu strony
textBox2 do wyświetlania dokumentu.

 
public partial class Form1 : Form
    {
        string str;
        public Form1()
        
        {
            InitializeComponent();
        }
private void button1_Click(object sender, EventArgs e)
        {
            string link=textBox1.Text;
            webBrowser1.Navigate(link);
            
        }
 private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            str = webBrowser1.Document.Body.OuterText;
            textBox2.Text = str;
        }
}
0

Niestety nadal pomijane są te fragmenty o których pisałem w pierwszym poście - Tak jakby nie zdążył ich pobrać, bo zamiast tych elementów pojawia się string obsługujący "wczytywanie" danego elementu strony, a konkretnie, cytując - "Chwileczkę...".

0

Przez streamreader jest to samo "Chwileczkę..."

StreamReader sr = new StreamReader(webBrowser1.DocumentStream);
string str=sr.ReadToEnd();
textBox2.Text = str; 

Z góry dziękuje za sugestie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1