2010-06-29 5 views
0

나는 아름 다운 스프와 일부 html 폼을 구문 분석 오전. 기본적으로 약 60 개의 입력 필드가 대부분 라디오 버튼과 체크 박스입니다. 지금까지 다음 코드와 함께 작동 :연관 목록 파이썬

from BeautifulSoup import BeautifulSoup 
x = open('myfile.html','r').read() 
out = open('outfile.csv','w') 
soup = BeautifulSoup(x) 
values = soup.findAll('input',checked="checked") 
# echoes some output like ('name',1) and ('value',4) 

for cell in values: 
# the following line is my problem! 
    statement = cell.attrs[0][1] + ';' + cell.attrs[1][1] + ';\r' 
    out.write(statement) 

out.close() 
x.close() 

을 코드에서 속성을 선택 내 문제 경악을 나타내는 것처럼, HTML 템플릿은 입력 필드에 속하는 인수의 순서를 혼합, 추한 때문이다. 나는 name = "somenumber"value = "someothernumber"에 관심이 있습니다. 불행히도 내 attrs [1] 접근 방식은 작동하지 않는다. 왜냐하면 이름과 값이 내 html에서 같은 순서로 발생하지 않기 때문이다.

결과 BeautifulSoup 목록에 연관성있게 액세스 할 수있는 방법이 있습니까?

미리 제안 사항이 있으면 알려주세요.

답변

2

나의 제안은 dictvalues을 확인하는 것입니다. 당신은 단순히 베드로가 한 말처럼, 자신의 속성 이름 값을 참조 할 수 있습니다 그 후

values = dict(soup.findAll('input',checked="checked")) 

: 당신이 의미하는 것으로 soup.findAll는 튜플의 목록을 반환하는 경우, 다음은 간단합니다.

물론, soup.findAll이 함축 한 것처럼 튜플 목록을 반환하지 않거나 튜플 자체가 이상한 방식으로 반환되는 경우 문제가 발생하면 ('name', 1) (1, 'name')이된다면 조금 더 복잡 할 수 있습니다.

반면에 soup.findAll이 특정 데이터 유형 집합 (dict 또는 dicts 목록, namedtuple 또는 namedtuples 목록) 중 하나를 반환하는 경우 수행 할 필요가 없기 때문에 실제로는 더 나을 것입니다. 처음부터 모든 전환.

... 예, BeautifulSoup 설명서를 확인한 후 findAll은 dicts 목록처럼 취급 될 수있는 개체를 반환하므로 피터가 말한 것처럼 할 수 있습니다. 이 속성을 열거하려면

http://www.crummy.com/software/BeautifulSoup/documentation.html#The%20attributes%20of%20Tags

아, 그래, 그냥 같은 것을 할 :

for cell in values: 
    for attribute in cell: 
     out.write(attribute + ';' + str(cell[attribute]) + ';\r') 
+0

, 하나의 루프가 충분했다. 내 대답을 Peter's 대답을 참조하십시오. –

2

난 당신이 해시의 키와 같은 속성 이름을 사용할 수 있습니다 상당히 확신 :

print cell['name'] 
+0

흠이 모두 답변을 :) 동의 할수 없어. thx 도움을 위해 기본적으로 값의 셀 : cell [ 'name'] + ';' + cell [ 'value'] 이 작업을 수행했으나 여기서 이중 루프가 필요하지 않습니다. 나를 위해 –