2017-01-12 10 views
0

Я изучаю Beautiful Soup и Python, и в этом контексте я выполняю упражнение «Ребенок» в Google Tutorial по Regex, используя набор html-файлов, содержащий популярные детские имена для разных лет (например, baby1990.html и т. д.). Вы можете найти этот набор данных, если вы заинтересованы здесь: https://developers.google.com/edu/python/exercises/baby-namesПазл «Прекрасный суп» с методом soup.find()

HTML-файлы содержат конкретную таблицу, в которой хранить популярные имена детей и чей HTML код следующим образом:

<table width="100%" border="0" cellspacing="0" cellpadding="4" summary="formatting"> 
<tr valign="top"><td width="25%" class="greycell"> 
<a href="../OACT/babynames/background.html">Background information</a> 
<p><br /> 
&nbsp; Select another <label for="yob">year of birth</label>?<br />  
<form method="post" action="/cgi-bin/popularnames.cgi"> 
&nbsp; <input type="text" name="year" id="yob" size="4" value="1990"> 
<input type="hidden" name="top" value="1000"> 
<input type="hidden" name="number" value=""> 
&nbsp; <input type="submit" value=" Go "></form> 
</td><td> 
<h3 align="center">Popularity in 1990</h3> 
<p align="center"> 
<table width="48%" border="1" bordercolor="#aaabbb" 
cellpadding="2" cellspacing="0" summary="Popularity for top 1000"> 
<tr align="center" valign="bottom"> 
<th scope="col" width="12%" bgcolor="#efefef">Rank</th> 
<th scope="col" width="41%" bgcolor="#99ccff">Male name</th> 
<th scope="col" bgcolor="pink" width="41%">Female name</th></tr> 
<tr align="right"><td>1</td><td>Michael</td><td>Jessica</td> # Targeted row 
<tr align="right"><td>2</td><td>Christopher</td><td>Ashley</td> # Targeted row 
etc... 

Существует также еще один стол html-файл, который я не хочу захватить, и имеет следующий код html.

<table width="100%" border="0" cellspacing="0" cellpadding="4"> 
    <tbody> 
    <tr><td class="sstop" valign="bottom" align="left" width="25%"> 
     Social Security Online 
    </td><td valign="bottom" class="titletext"> 
     <!-- sitetitle -->Popular Baby Names 
    </td> 
    </tr> 
    <tr bgcolor="#333366"><td colspan="2" height="2"></td></tr> 
    <tr><td class="graystars" width="25%" valign="top"> 
     <a href="../OACT/babynames/">Popular Baby Names</a></td><td valign="top"> 
     <a href="http://www.ssa.gov/"><img src="/templateimages/tinylogo.gif" 
     width="52" height="47" align="left" 
     alt="SSA logo: link to Social Security home page" border="0"></a><a name="content"></a> 
     <h1>Popular Names by Birth Year</h1>September 12, 2007</td> 
    </tr> 
    <tr bgcolor="#333366"><td colspan="2" height="1"></td></tr> 
</tbody></table> 

При сравнении таблицы тегов двух таблиц я пришел к выводу, что уникальная характеристика целевой таблицы - таблицы Я пытаюсь capture-- это «резюме» атрибут, который, как представляется, имеет значение ' форматирование. Поэтому я попробовал следующую команду:

right_table = soup.find("table", summary = "formatting") 

Однако этой команде не удалось выбрать целевую таблицу. В противоположность этому, следующая команда успешно:

table = soup.find(summary="Popularity for top 1000") 

Не могли бы вы объяснить, глядя на HTML код, почему первая команда не удалось, и второе удалось?

Ваш совет будет оценен по достоинству.

+0

Вы разобрали [эту страницу] (https://www.ssa.gov/OACT/babynames/)? – alecxe

+0

@alecxe \t 'request.get()' fail для этого URL-адреса. Любая идея почему? – MYGz

+0

@MYGz, что вы получаете? (это работает для меня) Это может быть ограничение страны? (так как это SSA Соединенных Штатов) – alecxe

ответ

1

enter image description here

Я ответил на ваш вопрос ранее, код работает.

И еще одна вещь, html.patser повреждена на python2, не используйте ее, используйте lxml.

+0

Отлично! Наконец он работал. Большое спасибо! Но скажите, почему ваша команда работала с summary = "" Популярность для 1000 лучших ", поскольку summary =" форматирование ".Я не могу понять это. – im7

+0

@ im7 есть два тега, содержащие' summary', просто выполните поиск по HTML-коду –