Python утилизация данных с неправильной HTML-структурой

0

У меня есть следующий код:

*** REST OF CODE OMITTED ***
try:
    fullURL = blitzurl + movie
    opener.open(blitzurl)
    urllib2.install_opener(opener)
    request = urllib2.Request(fullURL)
    requestData = urllib2.urlopen(request)
    htmlText = BeautifulSoup(requestData.read())

    #panel = htmlText.find(match_class(["panelbox"]))
    #table = htmlText.find("table", {"id" : "scheduletbl"})
    print htmlText

blah....

except Exception, e:
    print str(e)
    print "ERROR: ERROR OCCURED IN MAIN"

Я пытаюсь получить содержимое таблицы с идентификатором "scheduletbl" (который находится внутри div с классом с именем "panelbox")

код html выглядит так:

*** REST OF CODE OMITTED ***

<div class="panelbox">
<!-- !!!! content here !!!!! -->
<table border="0" cellpadding="2" cellspacing="0" id="scheduletbl" width="95%">
<tr>
<td align="left" colspan="3">
VC = Special Cinema (Velvet Class)<br/>
VS = Special Cinema (Velvet Suite)<br>
DC = Special Cinema (Dining Cinema)<br/>
S = Special Cinema (Satin)<br/>
3D = in RealD 3D<br/>
4DX = 4DX Cinema
</br></td>
</tr>
<tr>
<td class="separator2" colspan="3"><strong>BLITZMEGAPLEX - PARIS VAN JAVA, BANDUNG</strong></td>
</tr>
<tr>
<td colspan="3"><img align="left" height="16" hspace="5" src="../img/ico_rss_schedule_white.gif" width="16"/><strong><a class="navlink" href="../rss/schedule.php">RSS- Paris van Java</a></strong></td>
</tr>
<tr>
<td class="separator"> </td>
<td class="separator" colspan="2">TUESDAY, 24 SEPTEMBER 2013</td>
</tr>
<tr>
<td class="separator"> </td>
<td class="separator" rel="2D" width="20%">
10:30   
</td>
<td class="separator" width="30%">
<a class="navlink" href="https://www.blitzmegaplex.com/olb/seats.php?showdate=2013-09-24&amp;cinema=0100&amp;movie=MOV1954&amp;showtime=10:30&amp;suite=N&amp;movieformat=2D" target="_blank">Buy Tickets</a></td>
</tr></table></div></div>

<tr>
*** and more <tr> tags ***
*** REST OF CODE OMITTED ***

Проблема, с которой я сталкиваюсь, заключается в том, что, когда я пытаюсь извлечь контент на основе div-id, он срезается посередине (я предполагаю, что это неправильный закрывающий тег).

Дело также происходит, когда я пытаюсь извлечь контент на основе (используя его id). Он также будет срезаться посередине, потому что есть, где он не должен быть там.

Каков наилучший способ решить эту проблему? У меня нет контроля над данными, поскольку он сбрасывается с какого-либо веб-сайта.

Теги:
web-scraping
python-2.7
beautifulsoup

3 ответа

0

Неправильный закрывающий тег может создать проблему, если вы используете синтаксический анализатор, который включен по умолчанию с помощью python. Это, как сказано в "Прекрасном супе" Документация: не очень мягкая (до Python 2.7.3 или 3.2.2).

Итак, если вы используете версию до этого, вы можете установить lxmls HTML-парсер, который более мягкий

$ pip install lxml

или если вы хотите, чтобы тот же синтаксический анализ html выполнялся браузерами, вы можете установить парсер html5lib

$ pip install html5lib

Они могут лучше анализировать ваш HTML и быть устойчивыми к закрытию плохих тегов. Красивый суп автоматически выбирает лучший парсер, который вы установили.

  • 0
    Спасибо ... за предложение. К сожалению, я на Windows-машине (что означает, что я должен установить эквивалент GCC или Windows) штопать ... Тем не менее, я попробую это. Еще раз спасибо за предложение.
  • 0
    нет, вы просто устанавливаете pip и устанавливаете эти парсеры, как пирог. stackoverflow.com/questions/4750806/...
Показать ещё 2 комментария
0

Вы можете попытаться использовать https://scraperwiki.com/ - если вы хотите проверить, какой инструмент /lib подойдет вам лучше всего для этой задачи.

Существует возможность использования html5lib, pyquery, bs4 и т.д. (Простой для тестирования)

Вы можете попробовать beautifulsoup:

BeautifulSoup(html).prettify()

где html - ваш контент

BS должна хорошо справляться с плохим html...

0
re.search(r'id="scheduletbl".+?</table>', page, re.DOTALL) 

dotall, если задействованы новые строки. это уродливый не красивый способ сделать это

Ещё вопросы

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