Советы по использованию BeautifulSoup для таблиц HTML

0

Я пытаюсь использовать BeautifulSoup для получения информации из файлов HTML. После сужения супа через soup.table.table.tbody.find_all('table', attrs={'cellspacing': '0'}), это тот тип html, с которым я должен работать (я удалил некоторые из html, чтобы сэкономить место):

<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr><td>SOME CITY</td></tr>
</tbody>
</table>, <table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr><td>SOME ADDRESS</td></tr>
<tr><td>SOME ADDRESS 2</td></tr>
<tr><td>SOME CITY, STATE, ZIPCODE</td></tr>
<tr><td><a class="icon_arrow" href="http://SOMEURL" onclick="window.open('http://SOMEWEBSITE'); return false;" target="_blank">Visit website</a></td></tr>
</tbody>
</table>, <table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr><td>SOME NAME </td></tr>
</tbody>
</table>, <table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr><td nowrap="nowrap">SOME TELEPHONE</td></tr>
<tr><td><a class="icon_arrow" href="/mcs/[email protected]" onclick="window.open(%=contactUs%); return false;" target="_blank">E-mail Me</a></td></tr>
</tbody>
</table>, <table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr><td>SOME CTIY</td></tr>
</tbody>
</table>, <table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr><td>SOME ADDRESS</td></tr>
<tr><td>SOME ADDRESS2</td></tr>
<tr><td>SOME CITY, STATE, ZIPCODE</td></tr>
</tbody>
</table>, <table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr><td>SOME NAME </td></tr>
</tbody>
</table>, <table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr><td nowrap="nowrap">SOME TELEPHONE</td></tr>
<tr><td><a class="icon_arrow" href="/mcs/[email protected]" onclick="window.open(%=contactUs%); return false;" target="_blank">E-mail Me</a></td></tr>
</tbody>
</table>
</table>

Формат для этих страниц аналогичен, некоторые из них содержат больше или меньше записей. Информация, которую меня интересует, - это НЕКОТОРЫЙ ГОРОД, НЕКОТОРЫЙ АДРЕС, НЕКОТОРЫЙ АДРЕС2, НЕКОТОРЫЙ ГОРОД, ГОСУДАРСТВО, ЗАПИСЬ, ИМЯ, НЕКОТОРЫЙ ТЕЛЕФОН и [email protected] (хотя это можно пропустить).

Глядя на html, кажется, что вся соответствующая информация находится между тегами. Мне просто сложно получить BS, чтобы найти те теги для извлечения информации.

  • 0
    Поможет ли find_all("td") ? Это даст вам список всех тэгов. Затем вы можете использовать get_text для получения информации между тегами. Пропустите «E-mail Me», если вы не хотите адрес электронной почты.
  • 0
    Просто хочу присоединиться к некоторым альтернативам, которые стоит попробовать: lxml (который содержит BeautifulSoup) и pyquery . Я настоятельно рекомендую Pyquery. Обсуждение этой темы также может представлять интерес.
Показать ещё 1 комментарий
Теги:
web-scraping
beautifulsoup

3 ответа

1

Вы можете использовать такой код:

tables = soup.table.table.tbody.find_all('table', attrs={'cellspacing' : '0'})
for ta in tables:
    tds = ta.find_all('td')
    for td in tds:
        text = td.get_text()
        if "E-mail Me" not in text and "Visit website" not in text:
            print text
1

поиск точной части в html-документе может выполняться с помощью определенных имен тегов и атрибутов, если это невозможно, например, в общедоступном html-документе, и структура документа предсказуема, подумайте об использовании позиции тега, что означает .fine_all('tag name')[nth location]

например:

>>> soup.find_all('table')[1].tbody.find_all('td')[2]
<td>SOME CITY, STATE, ZIPCODE</td>
0

Можете ли вы найти отдельные теги, добавив их в конец существующего кода? Я бы также сохранил его до некоторой переменной (он вернется как список, я уверен). Так что-то вроде

    info =soup.table.table.tbody.find_all('table', attrs={'cellspacing' : '0'}).find_all('td')

Затем, чтобы извлечь, просто перейдите по списку с помощью get_text:

    for item in info:
        item.get_text()
  • 0
    Спасибо за вклад, Пат. Не похоже, что я могу сделать 'двойной find_all' в этом формате. Исходный find_all возвращает объект ResultSet, который не допускает другого find_all. Это такая логика, которой я должен следовать, хотя.
  • 1
    @RobTheBank ResultSet не имеет атрибута find_all , но каждый элемент в ResultSet имеет тип Tag и имеет метод find_all

Ещё вопросы

Сообщество Overcoder
Наверх
Меню