Вопрос

Я пытаюсь поцарапать 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top