2013-10-09 3 views
2

이 url에서 모든 (5) 테이블을 가져 오려고합니다.splinter select (value)가 속성 오류를 반환합니다.

http://www.molpower.com//VLCWeb/UIAboutMOL/PortScheduleInfo.aspx?pPort=NLRTMDE&pFromDate=01-Oct-2013&pToDate=10-Oct-2013

개별 페이지의 드롭 박스 내가 type(value)로 채울 수 있지만,이 페이지를 새로 고침하지 않습니다. 객체가 DOM에 더 이상 첨부되어 있지 않으므로 nextPage 버튼을 사용하여 페이지를 단계별로 실행하지 못합니다 (파편에서이를 해결하는 방법을 모르겠습니다).

드롭 다운을 채우려 고 시도한 다음 선택하는 중입니다.

역 추적 (마지막으로 가장 최근 통화) : 나는 아래의 코드를 사용

File "<stdin>", line 69, in <module> 
File "/usr/local/lib/python2.6/dist-packages/splinter/driver/webdriver/__init__.py", line 334, in select 
self.find_by_xpath('//select[@name="%s"]/option[@value="%s"]' % (self["name"], value))._element.click() 
File "/usr/local/lib/python2.6/dist-packages/splinter/element_list.py", line 73, in __getattr__ 
    self.__class__.__name__, name)) 
AttributeError: 'ElementList' object has no attribute '_element' 

이이 오류를 반환합니다. 어떤 도움을 가장 높이 평가! 선택 요소가 이름을 가지고 있지 않기 때문에

from splinter import Browser 
from lxml.html import parse 
from StringIO import StringIO 
from time import sleep 

url = r'http://www.molpower.com//VLCWeb/UIAboutMOL/PortScheduleInfo.aspx?pPort=NLRTMDE&pFromDate=01-Oct-2013&pToDate=10-Oct-2013' 

def _unpack(row, kind = 'td'): 
    elts = row.findall('.//%s' %kind) 
    return [val.text_content() for val in elts[0:7]] 

def parse_schdls_data(table): 
    rows = table.findall('.//tr') 
    hdrs = _unpack(rows[0], kind = 'th') 
    data = [_unpack(r, kind = 'td') for ir, r in enumerate(rows[1:-1]) if ir % 3 == 0] 
    return (hdrs, data) 

with Browser() as browser: 
    browser.visit(url) 
    print browser.url 

    pages = browser.find_by_tag('option') 

    pagevals = [p.value for p in pages] 
    maxpagev = max(pagevals) 

    inputs = browser.find_by_tag('input') 

    ''' 
    for ip, inp in enumerate(inputs): 
     if inp.has_class('btnMRBPageNext'): 
      #print ip, inp.value, inp.text 
      #Need input 35 for the nextPage 
      inp.click() 
    ''' 

    selects = browser.find_by_tag('select') 

    for ns, sel in enumerate(selects): 
     if sel.has_class('inputDropDown'): 
      print ns, sel.value, sel.text 
      sel.type(sel.value) 
      sleep(2) 

    moldata = list() 
    for page in range(len(pagevals)): 

     content = browser.html 
     parsed = parse(StringIO(content)) 
     doc = parsed.getroot() 
     tables = doc.findall('.//table') 
     schdls = tables[91] 

     #Get all rows from that table 
     rows = schdls.findall('.//tr') 
     hdr, data = parse_schdls_data(schdls) 
     #print page, data 
     moldata.append(data) 

     while browser.is_element_not_present_by_tag('select', wait_time = 2): 
      pass 

     inputs = browser.find_by_tag('input') 
     selects = browser.find_by_tag('select') 

     #inputs[35].click() 

     #selects[0].type(str(page + 1)) 
     selects[0].select(selects[0].value) 

답변

1

그래서 예를 들면 : 당신이

selects = browser.find_by_tag('select') 

를 호출하여 선택 요소에 대한 참조를 가지고 다음 전화를하지만

browser.find_by_xpath('//select[@id="MRBgvPortScheduleInformation_edlPager"]/option[@value="2"]')._element.click() 
0

이 요소들에 대한 방법을 선택하십시오.

selects[0].select(selects[0].value) 
(210)

그러나 우리가 알 수있는 역 추적에서, 가시 그것은 선택에 대한 이름이없는 경우 select 요소가 이름을 가지고 가정 어디가

self.find_by_xpath('//select[@name="%s"]/option[@value="%s"]' % (self["name"], value))._element.click() 

을 find_by_xpath로 변환 오류가있을 것입니다.

<html> 
<head> 
</head> 
<body> 
<select id='s1'> 
<option value='a'> A </option> 
<option value='b'> B </option> 
<option value='c'> C </option> 
</select> 

<select id='s2'> 
<option value='a'> A </option> 
<option value='b'> B </option> 
<option value='c'> C </option> 
</select> 

</body> 
</html> 

우리는 이전의 HTML 페이지와이 오류를 재현 할 수 있으며, 우리는이 개 select 요소에 이름을 추가 한 후 오류가 사라.

관련 문제