2016-07-03 5 views
1

셀레늄과 파이썬을 사용하여 웹 페이지를 긁어 내고 다음과 같은 구조의 div에서 원하는 데이터를 수집하는 데 어려움이 있습니다.셀렌과 파이썬을 사용하여 div에서이 데이터를 수집하는 방법

<div class="col span_6" style="margin-left: 12px;width: 47% !important;"> 
    <div class="MainGridRow"> 
    <span class="MainGridcolumn1">Heading1</span> 
    <span class="MainGridcolumn2">Text that I want</span> 
    </div> 
    <div class="MainGridRow"> 
    <span class="MainGridcolumn1">Another heading</span> 
    <span class="MainGridcolumn2">More text that I want</span> 
    </div> 
    <div class="MainGridRow"> 
    <span class="MainGridcolumn1">Next heading</span> 
    <span class="MainGridcolumn2">Even more text</span> 
    </div> 
    <div class="MainGridRow"> 
    <span class="MainGridcolumn1">Yet another heading</span> 
    <span class="MainGridcolumn2">Piece of text</span> 
    </div> 
</div> 

div에는 여러 행이 있으며 각 행에는 2 개의 열이 span 태그 내부에 데이터/텍스트를 포함합니다. CSS ID는 없습니다.

'MainGridcolumn2'스팬 클래스에 포함 된 텍스트 만 수집하는 데 관심이 있습니다.

텍스트를 포함하는 다음 span 태그로 이동하기 위해 'following_sibling'을 사용하려고 시도하면서 첫 번째 제목으로 이동하려했으나 작동하지 않습니다. 이 텍스트를 반환하지 않습니다 나는 콘솔에 인쇄하려고하면

driver.find_element_by_xpath("//span['@class=MainGridcolumn1'][contains(text(), 'Heading1')]").text 

driver.find_element_by_xpath("//span[contains(text(), 'Heading1')]").text 
+0

안녕을 얻을 수, MainGridcolumn1의 텍스트는 절대 변하지 않을 제목,하지만 값은 MainGridcolumn2에서는 항상 서로 다른 페이지의 데이터 순서가 바뀔 수 있습니다. 그래서 나는 heading spans로 이동 한 다음 값을 수집하기 위해 다음 범위로 이동하려고했습니다. – Matt

+0

다른 "MainGridRow"div가 있습니까? –

+0

예 - 총합 20 점 – Matt

답변

0

한 가지 방법은 바깥 쪽이 DIV 즉 조부모를 얻고 스팬을 당겨하는 것 그에서 :

,451,515,
h = """<div class="col span_6" style="margin-left: 12px;width: 47% !important;"> 
    <div class="MainGridRow"> 
    <span class="MainGridcolumn1">Heading1</span> 
    <span class="MainGridcolumn2">Text that I want</span> 
    </div> 
    <div class="MainGridRow"> 
    <span class="MainGridcolumn1">Another heading</span> 
    <span class="MainGridcolumn2">More text that I want</span> 
    </div> 
    <div class="MainGridRow"> 
    <span class="MainGridcolumn1">Next heading</span> 
    <span class="MainGridcolumn2">Even more text</span> 
    </div> 
    <div class="MainGridRow"> 
    <span class="MainGridcolumn1">Yet another heading</span> 
    <span class="MainGridcolumn2">Piece of text</span> 
    </div> 
</div> 

    <div class="MainGridRow"> 
    <span class="MainGridcolumn1">Yet another heading</span> 
    <span class="MainGridcolumn2">Piece of text I don't want</span> 
    </div>""" 

from lxml import html 

xm = html.fromstring(h) 
div = xm.xpath("//span[@class='MainGridcolumn1'][contains(text(), 'Heading1')]/../..")[0] 
print(div.xpath(".//span[@class='MainGridcolumn2']/text()")) 

당신을 줄 것이다 :

['Text that I want', 'More text that I want', 'Even more text', 'Piece of text'] 

또한 단지 부모를 선택하고 부모 형제에게

from lxml import html 

xm = html.fromstring(h) 
div = xm.xpath("//span[@class='MainGridcolumn1'][contains(text(), 'Heading1')]/..")[0] 
print(div.xpath(".//span[@class='MainGridcolumn2']/text() | .//following-sibling::div/span[@class='MainGridcolumn2']/text()")) 
+0

감사합니다. 나는 원래 전체 페이지 소스를 "h"로 넘겼지 만 너무 커 보이고 파이썬이 오류를 던지므로이 div로 이동 한 다음 나머지 코드를 사용해야했습니다. – Matt

+0

걱정하지 마세요. 무엇이 오류였습니까? –

+0

내 머리 꼭대기에서 기억이 나지 않지만, 너무 긴 문자열에 관한 것이라고 생각합니까? – Matt

관련 문제