2012-11-21 4 views
4

나는 완전히 당황합니다. 큰 테이블에서 긁어 낸 HTML 블록이 있습니다. 그것은 다음과 같이 약 같습니다이터레이터의 내용은 어떻게 얻습니까?

<td align="left" class="page">Number:\xc2\xa0<a class="topmenu" href="http://www.example.com/whatever.asp?search=724461">724461</a> Date:\xc2\xa01/1/1999 Amount:\xc2\xa0$2.50 <br/>Person:<br/><a class="topmenu" href="http://www.example.com/whatever.asp?search=LAST&amp;searchfn=FIRST">LAST,\xc2\xa0FIRST </a> </td> 

(사실, 더 나쁜 모습,하지만 난 줄 바꿈을 많이 밖으로 regexed) 나는 아웃 라인을 얻고, 날짜/금액 라인을 중단 할 필요가

을 . 시작해야 할 장소가 HTML 블록의 하위 항목을 찾는 것 같았습니다. 블록은 문자열이기 때문에 정규 표현식이 나에게 다시 돌려주었습니다. 그렇게 했어.

text_soup = BeautifulSoup(text) 
text_children = text_soup.find('td').childGenerator() 

I can only iterate through text_children once 나는 그것이 왜 그런지 이해하지 못한다. 그것은 listiterator 유형입니다. 이해하기가 어렵습니다.

나는 for 루프로 무언가를 반복 할 수 있다면 text_children [0]과 같은 어떤 요소를 호출 할 수 있다고 가정하는 데 익숙하다. iterator의 경우는 그렇지 않습니다. 내가 가진 목록을 작성하는 경우 :

my_array = ["one","two","three"] 

을 나는 배열의 두 번째 항목을 볼 수 my_array[1]를 사용할 수 있습니다.

TypeError: 'listiterator' object is not subscriptable 

어떻게 반복자의 내용을받을 수 있나요 : 나는 text_children[1]을하려고하면 오류가 발생합니다?

+0

생성기는 메모리를 절약하도록 설계되었으며 항목을 하나씩 생성 할 때만 반복 트릭을 수행하도록 설계되었습니다. –

+1

물론 나는 독서 독서를 읽음으로써 이것을 알아 냈습니다. 나는 대답을 받아들이 기 위해 조금 기다려야 만한다. – Amanda

답변

1

내가 좀 더 일반적인 대답을 해결하려고 :

  • 반복 가능이 이상 반복 할 수있는 객체입니다. 여기에는 목록, 튜플 등이 포함됩니다. 요청하면 iterator를 제공합니다.

  • 이터레이터는 이 사용되며 반복을 위해이 사용됩니다. 각 요청에 대해 값을 제공하고 끝나면 끝납니다. 이것들은 생성자,리스트 반복자 등이지만 e. 지. 파일 개체. 모든 반복자는 반복 가능하며 반복자로 제공됩니다.

예 :

a = [] 
b = iter(a) 
print a, b # -> [] <listiterator object at ...> 

당신이

for i in a: ... 

A가 그 __iter__() 방법을 통해 반복자를 요청하고,이 반복자는 다음 소진 될 때까지 다음 요소에 대한 쿼리를 수행합니다. 이것은 .next() (3.x의 경우 __next__()) 메소드를 통해 발생합니다.

색인 생성은 완전히 다른 것입니다. 객체에 .__iter__() 메소드가없는 경우 반복을 통해 인덱싱을 수행 할 수 있으므로 모든 인덱싱 가능 객체는 반복 가능하지만 그 반대로는 수행 할 수 없습니다.

8

당신은 쉽게 반복자에서 목록을 구성 할 수 있습니다 :

my_list = list(your_generator) 

지금 당신이 요소를 첨자 수 있습니다

print(my_list[1]) 

값을 얻을 수있는 또 다른 방법은 next을 사용하는 것입니다. 이것은 반복기에서 다음 값을 가져 오지만, 이미 발견했듯이 반복자에서 값을 가져 오면 항상 다시 넣을 수는 없습니다 (다시 넣을 수 있는지 여부는 완전히 반복되는 객체와 그 메소드가 실제로 어떻게 보이는지).

이유는 반복 할 수있는 개체를 원하는 경우가 많기 때문입니다. 이터레이터는 위대한입니다. 왜냐하면 모든 값을 저장하지 않고 한 번에 하나씩 요소를 계산할 때입니다. 즉, 반복 실행을 시작하기 전에 모든 요소가 일반적으로 메모리에 저장되는 목록 또는 튜플과 비교하여 시스템의 메모리를 한 번에 소비하는 반복기의 요소 하나만 사용할 수 있습니다.

1

짧은 답변은 앞서 말한 것처럼 발전기에서 목록을 만드는 것입니다.

과 같이 : list(generator)

긴 대답과에 관해서 설명하는 이유 :

당신이 발전기 인 발전기, 또는 경우에 '반복자'을 만들

아름다운 수프 사용, 당신은 정말로 항목의 목록을 만들지 않습니다. 한 번에 하나씩 특정 항목을 반복하는 방법을 알고있는 객체 (생성기)를 만들고 있습니다 ( next())

의미가 무엇인지.

대신 페이지가있는 책을 원하는대로 지정할 수 있습니다.

타자기가 있습니다.

타자기는 한 번에 한 페이지 씩만 페이지가있는 책을 만들 수 있습니다. 이제, 처음부터 시작해서 for 루프처럼 한 번에 하나씩 살펴 본다면 보통의 책을 읽는 것과 거의 같습니다.

일반 책과 달리 타자기가 페이지로 끝나면 뒤로 이동할 수 없으며 해당 페이지는 사라졌습니다.

나는 이것이 약간 이해되기를 바랍니다.

관련 문제