2017-12-06 8 views
1

파이썬 요청 모듈을 사용하여 전자 상거래 웹 사이트를 고치고 있습니다. 글쎄 여러 노드 사이의 텍스트를 추출하는 데 문제가 있습니다. 다음 html은 텍스트를 추출하려고하는 부분입니다. 두 개의 (p) 태그와 모든 (strong) 태그에 포함 된 div 클래스 = "rte 구성 요소"아래의 모든 텍스트를 추출해야합니다. 주의! (강한) 태그는 페이지마다 다를 수 있습니다.Xpath는 여러 노드 사이의 모든 텍스트를 추출합니까?

<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> 

음, 다음 코드를 사용하고 있지만 결과는 부분적입니다.

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

반대로 (DIV) 태그 아래의 모든 텍스트를 추출해야합니다.

누군가가 도와 드릴 수 있습니까? 감사!

+0

나는 코드의 일부 추가 깜빡 미안 해요 : 응답 = requests.get (URL)를 파서 = html.fromstring (응답) ([문자열 LXML을 반환하는 힘의 XPath]의 – CosimoCD

+0

가능한 중복는 .text https://stackoverflow.com/questions/34461840/force-xpath-to-return-a-string-lxml) –

답변

1

lxml 라이브러리를 사용하고있는 것으로 보입니다. 그렇다면 아래 메서드는 전체 내용을 가져와야합니다. print 문에 .text 대신 .text_content()을 사용하십시오.

string(/path/to/div) 

이 방법, 당신의 XPath는 어떤 준수의 XPath 라이브러리에 이식해야한다 (:

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

감사합니다. @Shahin! 그것은 잘 작동합니다! – CosimoCD

0

순수한 XML/XPath는 솔루션은 div 대상으로 직접의 string value를 선택 XPath를 변경하는 것 text_content()과 같은 비정형적이고 특이한 액세스 기능을 기억할 필요성을 최소화 할 수 있습니다.