2017-01-09 13 views
0

Я изучаю красивый суп и словари на Python. Я следую короткому учебному курсу в Beautiful Soup от Стэнфордского университета, который можно найти здесь: http://web.stanford.edu/~zlotnick/TextAsData/Web_Scraping_with_Beautiful_Soup.htmlСохранение значений, полученных Beautiful Soup, в словаре, а затем доступ к этим значениям

Поскольку доступ к веб-сайту запрещен, я сохранил текст, представленный в учебнике, в строку, а затем преобразовал суп-суп в суп-объект , Распечатка выглядит следующим образом:

print(soup_string) 

<html><body><div class="ec_statements"><div id="legalert_title"><a  
href="/Legislation-and-Politics/Legislative-Alerts/Letter-to-Senators- 
Urging-Them-to-Support-Cloture-and-Final-Passage-of-the-Paycheck- 
Fairness-Act-S.2199">'Letter to Senators Urging Them to Support Cloture  
and Final Passage of the Paycheck Fairness Act (S.2199) 
</a> 
</div> 
<div id="legalert_date"> 
September 10, 2014 
</div> 
</div> 
<div class="ec_statements"> 
<div id="legalert_title"> 
<a href="/Legislation-and-Politics/Legislative-Alerts/Letter-to- 
Representatives-Urging-Them-to-Vote-on-the-Highway-Trust-Fund-Bill"> 
Letter to Representatives Urging Them to Vote on the Highway Trust Fund Bill 
</a> 
</div> 
<div id="legalert_date"> 
     July 30, 2014 
     </div> 
</div> 
<div class="ec_statements"> 
<div id="legalert_title"> 
<a href="/Legislation-and-Politics/Legislative-Alerts/Letter-to-Representatives-Urging-Them-to-Vote-No-on-the-Legislation-Providing-Supplemental-Appropriations-for-the-Fiscal-Year-Ending-Sept.-30-2014"> 
     Letter to Representatives Urging Them to Vote No on the Legislation Providing Supplemental Appropriations for the Fiscal Year Ending Sept. 30, 2014 
     </a> 
</div> 
<div id="legalert_date"> 
     July 30, 2014 
     </div> 
</div> 
<div class="ec_statements"> 
<div id="legalert_title"> 
<a href="/Legislation-and-Politics/Legislative-Alerts/Letter-to-Senators-Urging-Them-to-Vote-Yes- 
      on-the-Motion-to-Proceed-to-the-Emergency-Supplemental-Appropriations-Act-of-2014-S.2648"></a></div></div></body></html> 

В какой-то момент учитель фиксирует все элементы в объекте супа, которые имеют метку «ДИВ», класс _ = «ec_statements».

letters = soup_string.find_all("div", class_="ec_statements") 

Затем воспитатель говорит:

«Мы пройдем все пункты в нашей коллекции писем, и для каждого из них, вытащить имя и сделать его ключевым в нашем Сыроватского. значение будет другим dict, но мы еще не нашли содержимое для других элементов, поэтому мы просто создадим назначение пустого объекта dict. "

Код следующее:

lobbying = {} 
for element in letters: 
    lobbying[element.a.get_text()] = {} 

Однако при печати ключи и значения словаря лоббистской я обнаружил, что последний элемент - «Письмо к сенаторам поджимающего-Them-to Vote-Yes-on-the-Motion-to-Pro-to-the-Emergency-Supplemental-Asspriations-Act-of-2014-S.2648 "- отсутствует. Вместо этого существовал пустой словарь без назначенного ему ключа.

for key, value in lobbying.iteritems(): 
    print key, value 

{} 

     Letter to Representatives Urging Them to Vote No on the Legislation Providing Supplemental Appropriations for the Fiscal Year Ending Sept. 30, 2014 
     {} 

     Letter to Representatives Urging Them to Vote on the Highway Trust Fund Bill 
     {} 
'Letter to Senators Urging Them to Support Cloture and Final Passage of the Paycheck Fairness Act (S.2199) 
     {} 

Как вы это объясните? Ваш совет будет оценен по достоинству.

+0

последний 'div' не имеет текста, поэтому он создает элемент с пустой строкой в ​​качестве ключа. И вы видите это как «пустой словарь без назначенного ему ключа». – furas

+0

BTW: используйте, по крайней мере, 'print"> ", key," <"', и вы увидите, что у вас есть ключ, который является пустой строкой или имеет только 'пробелы',' tabs' и 'enters' – furas

ответ

0

Элемент <a> последнего <div class="ec_statements"> не имеет какой-либо текст в нем:

<a href="/Legislation-and-Politics/Legislative-Alerts/Letter-to-Senators-Urging-Them-to-Vote-Yes- 
      on-the-Motion-to-Proceed-to-the-Emergency-Supplemental-Appropriations-Act-of-2014-S.2648"> 
</a> 

Сравните это с другой DIV выше:

<a href="/Legislation-and-Politics/Legislative-Alerts/Letter-to- 
Representatives-Urging-Them-to-Vote-on-the-Highway-Trust-Fund-Bill"> 
Letter to Representatives Urging Them to Vote on the Highway Trust Fund Bill 
</a> 

Как вы можете видеть, текст в 2 пример появляется после тега <a> и перед тегом </a>. В первом примере такого текста нет.

0

Вы вызываете element.a.get_text() для генерации ключа, но тег для последнего элемента не имеет текстового содержания: <a ...></a>