2017-06-18 5 views
0

Ich bin so ziemlich neu, und ich konnte nichts auf Google auf dieser Frage zu finden.Web Scraping mit Python Anfrage/lxml: Daten von ul/li

Ich verwende Anfrage und lxml mit Python, habe ich gesehen, dass viele verschiedene Module für Web-Scraping da ist, aber gibt es einen Grund, warum man über wählen das andere? Kannst du das gleiche mit Anfragen/lxml machen, wie zum Beispiel mit BeautifulSoup?

Wie auch immer, hier ist meine tatsächliche Frage;

Dies ist mein Code:

import requests 
from lxml import html 

# Login data 
inputUrl = 'http://forum.mytestsite.com/login' 
usr = 'myusername' 
pwd = 'mypassword' 
payload = dict(login=usr, password=pwd) 

# Open session 
with requests.Session() as s: 
    # Login 
    s.post(inputUrl, data=payload) 

    # Get page data 
    pageResult = s.get('http://forum.mytestsite.com/icons/', allow_redirects=False) 
    pageResult = html.fromstring(pageResult.content) 
    pageIcons = pageResult.xpath('//script[@id="table-icons"]/text()') 
    print pageIcons[0] 

Das Ergebnis, wenn pageIcons Druck [0]:

<ul id="icons"> 
{{#each icons}} 
    <li data-handle="{{handle}}"> 
    <img src="{{image_path}}" alt="{{desc_or_name this}}" title="{{desc_or_name this}}"> 
    </li> 
{{/each}} 
</ul> 


Dies ist die Website/js-Code, der erzeugt Symbole:

<script id="table-icons" type="text/x-handlebars-template"> 
    <ul id="icons"> 
    {{#each icons}} 
     <li data-handle="{{handle}}"> 
     <img src="{{image_path}}" alt="{{desc_or_name this}}" title="{{desc_or_name this}}"> 
     </li> 
    {{/each}} 
    </ul> 
</script> 

Und hier ist das Ergebnis auf der Seite:

<ul id="icons"> 
    <li data-handle="558FSTBI" class=""> 
     <img src="http://testsite.com/icons/558FSTBI.1.png" alt="Icon 1" title="Icon 1"> 
    </li> 
    <li data-handle="310AYTZI"> 
     <img src="http://testsite.com/icons/310AYTZI.1.png" alt="Icon 2" title="Icon 2"> 
    </li> 
    <li data-handle="669PQXBI" class=""> 
     <img src="http://testsite.com/icons/669PQXBI.1.png" alt="Icon 3" title="Icon 3"> 
    </li> 
</ul> 



Mein Ziel:
Was würde ich zu tun ist, um alle abrufen li Daten -Handles, aber ich konnte nicht herausfinden, wie diese Daten abgerufen werden. Mein Ziel ist es, alle Symbolpfade und ihre Titel zu finden, könnte mir hier jemand helfen? Ich würde wirklich jede Hilfe zu schätzen :)

+0

'// script' ist nicht Teil des HTML gerendert.Warum versuchen Sie, den Vorlagencode zu analysieren? –

+0

Nun, weil ich ein Noob bin: P Ich habe gelernt, weil das Skript gibt mir die ul/li Griffe von dem, was ich eigentlich will, dass es logisch war, es so zu machen. Ich meine, das gerenderte HTML wird aus dem Skript generiert, richtig? Wie kann ich sonst die Links bekommen? – Lorena

+0

Sie können den Vorlagencode nicht von Python-Anfragen abrufen. Plus, wenn es nach dem Laden der Seite gerendert wird, erhalten Sie eine leere Liste und Sie können die Anfragen sowieso nicht verwenden. https://stackoverflow.com/questions/13960567/reading-dynamisch-generated-web-pages-using-python –

Antwort

0

Sie analysieren nicht die li oder ul.

Beginnen Sie mit diesem

//ul[@id='icons']/li/img 

Und von diesen Elementen können Sie die einzelnen Informationen

In Bezug auf die erste Frage extrahieren, beautifulsoup lxml optional verwendet. Wenn Sie nicht glauben, dass Sie es brauchen und mit XPath vertraut sind, machen Sie sich keine Sorgen.

Da es sich jedoch um Javascript handelt, das die Seite generiert, benötigen Sie einen kopflosen Browser und keine Bibliothek.

Get page generated with Javascript in Python

Reading dynamically generated web pages using python

+0

Das ist was komisch, wenn ich versuche, dass ich nur eine leere Liste zurückbekomme. Es sieht nicht so aus, als wäre es möglich, den Inhalt der Links zu erhalten:/Wie kann ich über das Debuggen dieses gehen? – Lorena

+0

Ich benutzte ein Online-XPath-Tool, und es funktionierte gut, nachdem ich die '' –

+0

geschlossen habe Danke für Ihre Hilfe. Schade, dass es nicht möglich ist, JS-generierte Seiten zu erhalten, ohne einen Browser emulieren zu müssen: – Lorena