2010-09-26 2 views
4

Я очень новичок в python и beautifulsoup.Помогите интерпретировать фрагмент кода

В заявлении for, что такое incident? Это класс, тип, переменная? Линия, следующая за для .. полностью потерян.

Может кто-нибудь объяснить этот код мне?

for incident in soup('td', width="90%"): 
    where, linebreak, what = incident.contents[:3] 
    print where.strip() 
    print what.strip() 
    break 
print 'done' 
+0

Я не использовал красивый суп, но я знаю, что это для разбора HTML, поэтому я предполагаю, что этот инцидент является элементом DOM. EDIT: кажется, моя догадка была неправильной, судя по @Mark Byers ответ. – dgnorton

ответ

3

Первый оператор запускает цикл, который анализирует HTML-документ, ищущий элементы td с шириной, установленной на 90%. Объект, представляющий элемент td, привязан к имени incident.

Вторая строка представляет собой множественное присваивание и может быть переписано следующим образом:

where = incident.contents[0] 
linebreak = incident.contents[1] 
what = incident.contents[2] 

Другими словами, он извлекает содержимое из тега тд и дает каждому элементу более значимое имя.

Последняя строка в цикле заставляет цикл прерываться после проверки только первого элемента. Код можно было бы переписать, чтобы не использовать цикл, который бы сделал его более понятным.

0

Прежде всего, Python заботится о том, где находятся новые строки и пробелы, поэтому вы должны использовать тег кода для представления кода Python. Как и я, я должен угадать, как был изначально отформатирован ваш код.

for incident in soup('td', width="90%"): 
    where, linebreak, what = incident.contents[:3] 
    print where.strip() 
    print what.strip() 
    break 
print 'done' 

«для х в у:» утверждение предполагает, что «у» является своего рода Iterable (список подобных) вещь - это упорядоченный набор объектов. Затем для каждого элемента списка он присваивает элементу имя «x» и запускает отложенный блок.

В этом случае появляется функция soup(), которая возвращает список инцидентов. Каждый инцидент - это объект, который содержит атрибут, называемый «содержимым», который сам является списком; [: 3] означает «первые три элемента списка». Так что эта строка берет первые три вещи в содержании инцидента и присваивает им имена «где», «linebreak» и «what». Функция strip() удаляет пробелы с начала и конца строки. Поэтому мы печатаем «где» и «что». «break» выходит из цикла for, поэтому в этом случае он запускается только один раз, что немного странно.

+0

'заказать коллекцию предметов' Закачать не надо – Falmarri

+0

Спасибо. Я оставил верхнюю часть кода – NewB

+0

страница = urllib2.urlopen («http://www.icc-ccs.org/prc/piracyreport.php») soup = BeautifulSoup (страница) – NewB

1

Добро пожаловать в переполнение стека! Давайте посмотрим, что происходит. Я добавил ссылки для дальнейшего чтения на этом пути, взгляните на них, прежде чем задавать дополнительные вопросы.

for incident in soup('td', width="90%"): 

incident просто произвольная локальная переменный для итерации возвращаемого soup. Вообще говоря, локальная переменная в for statement, вероятно, является списком, но может быть кортежем или даже строкой. Если возможно перебрать что-то, например файл, то Python, вероятно, примет for, чтобы просмотреть элементы.

В этом случае soup возвращает список td HTML-элементов шириной 90%. Мы можем увидеть это из-за того, что происходит на следующей строке:

 where, linebreak, what = incident.contents[:3] 

where, linebreak и what все произвольные локальные переменные, а также. Все они назначаются в одном заявлении.В Python это называется multiple assignment. Откуда берутся эти три элемента? incident.contents[:3] запрашивает первые три элемента, используя slice notation.

 print where.strip() 
     print what.strip() 

Эти две линии печати where и what на screen.¹ Но что strip делать? Это удаление пробела. Итак, " some text " станет "some text".

 break 

break просто разорвать петлю for после его первого цикла. Это не нарушает всю программу. Вместо этого он возвращает поток программы на следующую строку после цикла.

print 'done' 

Это просто делает то, что он говорит, отправляя слова «сделано» на экран. Если вы используете эту программу, вы знаете, что она завершена, когда вы видите «done» (без кавычек) на экране.

¹ Чтобы быть более технически точными, они отправляют байты в стандартную версию (обычно называемую stdout).

+0

'break' необходим в этом случае, потому что он гарантирует, что цикл' for' запускается только один раз. – aaronasterling

+0

спасибо @Aaron, отредактируйте ответ. –

Смежные вопросы