Beautifulsoup получить значение в таблице
-
08-07-2019 - |
Вопрос
Я пытаюсь поцарапать http://www.co.jefferson.co.us/ ATS / displaygeneral.do? сч = 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, я просмотрел их, но не нашел ответ, который мне помог, надеюсь, это не повторяющийся вопрос
Решение
( Изменить : очевидно, что 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
.
Другие советы
Это ответ Аарона ДеВора из дискуссионной группы 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)")]
Это небольшое улучшение, но я не мог понять, как избавиться от трех родителей.
x[0].parent.parent.parent.findAll('td')[1].string