2017-12-06 6 views
1

Ich kratze eine E-Commerce-Website mit dem Python-Requests-Modul. Nun, ich habe ein Problem beim Extrahieren des Textes zwischen mehreren Knoten. Das folgende HTML ist der Teil, in dem ich versuche, den Text zu extrahieren. Ich muss den gesamten Text unter den (div class = "rte ingredients") extrahieren, der in die zwei (p) -Tags und alle (starken) Tags eingebettet ist. Passt auf! Die (starken) Tags können von Seite zu Seite variieren.Xpath den gesamten Text zwischen mehreren Knoten extrahieren?

<div class="rte ingredients"> 
    <p>Farina sbiancata arricchita (farina sbiancata di 
    <strong>grano</strong>, 
    ferro ridotto, vitamine B3-B1-B2-B9), zucchero, 
    agenti lievitanti E500ii-E541i-E341i, destrosio, 
    <strong>latte</strong> 
    scremato disidratato, olio di 
    <strong>soia</strong> parzialmente 
    idrogenato, sale, 
    <strong>glutine</strong> di <strong>grano</strong>, 
    colorante E170, estratto secco di sciroppo di granoturco, caseinati di 
    sodio (<strong>latte</strong>), emulsionante E471, regolatore di acidità 
    E270. Può contenere tracce di <strong>uova</strong>. Contiene OGM.</p> 

    <p>Valori nutrizionali (per 100g): energia 348Kcal, lipidi 3.3g (di cui 
    grassi saturi 0g), carboidrati 69.6g (di cui zuccheri 13g), proteine 
    10.9g, sale 2.6g.</p> 
</div> 

Nun, ich verwende den folgenden Code, aber das Ergebnis ist teilweise.

ingredients = parser.xpath('//*[@id="bottom_right_product_infos"]/section[2]/div/p[1]/text()') 
print ingredients 
['Farina sbiancata arricchita (farina sbiancata di'] 

Umgekehrt muss ich den gesamten Text unter dem (DIV) Tag extrahieren.

Kann mir jemand dabei helfen? Vielen Dank!

+0

Es tut mir leid ich einen Teil des Codes hinzufügen vergessen: response = requests.get (url) .text Parser = html.fromstring (Antwort) – CosimoCD

+0

Mögliche Duplikat [force XPath eine Zeichenfolge lxml zurückzukehren] (https://stackoverflow.com/questions/34461840/force-xpath-to-return-a-string-lxml) –

Antwort

1

Es scheint, dass Sie lxml Bibliothek verwenden. Wenn dies der Fall ist, sollte die folgende Methode den vollständigen Inhalt abrufen. Verwenden Sie in der print-Anweisung .text_content() anstelle von .text.

content=''' 
<div class="rte ingredients"> 
    <p>Farina sbiancata arricchita (farina sbiancata di 
    <strong>grano</strong>, 
    ferro ridotto, vitamine B3-B1-B2-B9), zucchero, 
    agenti lievitanti E500ii-E541i-E341i, destrosio, 
    <strong>latte</strong> 
    scremato disidratato, olio di 
    <strong>soia</strong> parzialmente 
    idrogenato, sale, 
    <strong>glutine</strong> di <strong>grano</strong>, 
    colorante E170, estratto secco di sciroppo di granoturco, caseinati di 
    sodio (<strong>latte</strong>), emulsionante E471, regolatore di acidità 
    E270. Può contenere tracce di <strong>uova</strong>. Contiene OGM.</p> 

    <p>Valori nutrizionali (per 100g): energia 348Kcal, lipidi 3.3g (di cui 
    grassi saturi 0g), carboidrati 69.6g (di cui zuccheri 13g), proteine 
    10.9g, sale 2.6g.</p> 
</div> 
''' 
from lxml.html import fromstring 
root = fromstring(content) 
for items in root.xpath("//div[contains(@class,'ingredients')]/p"): 
    print(items.text_content()) #take a closer look at this .text_content() instead of .text. 
+0

Danke @Shahin! Es funktioniert gut! – CosimoCD

0

Die reine XML/XPath Lösung wäre, die XPath zu ändern, um die string value der gezielt direkt wählen div:

string(/path/to/div) 

Auf diese Weise sollte Ihr XPath eine konforme XPath-Bibliothek tragbar sein (und Sie können Ihre Notwendigkeit minimieren, sich an nicht standardmäßige, idiosynkratische Zugriffsfunktionen wie text_content() zu erinnern.

Verwandte Themen