Beautifulsoup получить значение в таблице - PullRequest
1 голос
/ 30 ноября 2009

пытаюсь поцарапать http://www.co.jefferson.co.us/ats/displaygeneral.do?sch=000104 и получите «Имя (и) владельца» То, что у меня работает, но на самом деле уродливо и не самое лучшее, я уверен, поэтому я ищу лучший путь. Вот что у меня есть:

soup = BeautifulSoup(url_opener.open(url))            
x = soup('table', text = re.compile("Owner Name"))
print 'And the owner is', x[0].parent.parent.parent.tr.nextSibling.nextSibling.next.next.next

Соответствующий HTML является

<td valign="top">
    <table border="1" cellpadding="1" cellspacing="0" align="right">
    <tbody><tr class="tableheaders">
    <td>Owner Name(s)</td>
    </tr>

    <tr>

    <td>PILCHER DONALD L                         </td>
    </tr>

    </tbody></table>
</td>

Ух ты, есть много вопросов о BeautifulSoup, я просмотрел их, но не нашел ответ, который мне помог, надеюсь, это не повторяющийся вопрос

Ответы [ 3 ]

5 голосов
/ 30 ноября 2009

( Редактировать : очевидно, что HTML, который опубликовал ОП, лежит - на самом деле нет тега tbody, который нужно искать, хотя он и сделал это целью включения в этот HTML. использовать table вместо tbody).

Поскольку может быть несколько строк таблицы, которые вы хотите (например, посмотрите родственный URL-адрес того, который вы даете, с последней цифрой 4, замененной на 5), я предлагаю цикл, такой как:

# locate the table containing a cell with the given text
owner = re.compile('Owner Name')
cell = soup.find(text=owner).parent
while cell.name != 'table': cell = cell.parent
# print all non-empty strings in the table (except for the given text)
for x in cell.findAll(text=lambda x: x.strip() and not owner.match(x)):
  print x

это достаточно устойчиво к незначительным изменениям в структуре страницы: обнаружив интересующую ячейку, он зацикливает своих родителей до тех пор, пока не найдет тег таблицы, а затем перебирает все строки в этой таблице, которые не являются пустыми (или просто пробелами) ), исключая заголовок owner.

3 голосов
/ 30 ноября 2009

Это ответ Аарона ДеВора из дискуссионной группы Beautifulsoup: «Это хорошо для меня».

soup = BeautifulSoup(...)
label = soup.find(text="Owner Name(s)")

Требуется Tag.string, чтобы получить фактическое имя строки

name = label.findNext('td').string

Если вы делаете кучу из них, вы можете даже пойти на понимание списка.

names = [unicode(label.findNext('td').string) for label in
soup.findAll(text="Owner Name(s)")]
1 голос
/ 30 ноября 2009

Это небольшое улучшение, но я не мог понять, как избавиться от трех родителей.

x[0].parent.parent.parent.findAll('td')[1].string
...