BeautifulSoup превосходен в разборе и извлечении данных из плохо отформатированного HTML / XML, но если разбитый HTML является неоднозначным, он использует набор правил для интерпретации тегов (что может быть не тем, что вы хотите) , См. Раздел Синтаксический анализ HTML в документации, который заканчивается примером, очень похожим на вашу ситуацию.
Если вы знаете, что не так с вашими тегами, и понимаете правила, которые использует BeautifulSoup, вы можете немного улучшить свой HTML (возможно, удалить или переместить определенные теги), чтобы BeautifulSoup возвращал желаемый результат.
Если вы можете опубликовать краткий пример, кто-то может оказать вам более конкретную помощь.
Обновление (некоторые примеры)
Например, рассмотрим пример, приведенный в документации (ссылка выше):
from BeautifulSoup import BeautifulSoup
html = """
<html>
<form>
<table>
<td><input name="input1">Row 1 cell 1
<tr><td>Row 2 cell 1
</form>
<td>Row 2 cell 2<br>This</br> sure is a long cell
</body>
</html>"""
print BeautifulSoup(html).prettify()
Тег <table>
будет закрыт до </form>
, чтобы обеспечить правильное вложение таблицы в форму, оставляя последний <td>
зависшим.
Если мы понимаем проблему, мы можем получить правильную закрывающую вкладку (</table>
), удалив "<form>"
перед анализом:
>>> html = html.replace("<form>", "")
>>> soup = BeautifulSoup(html)
>>> print soup.prettify()
<html>
<table>
<td>
<input name="input1" />
Row 1 cell 1
</td>
<tr>
<td>
Row 2 cell 1
</td>
<td>
Row 2 cell 2
<br />
This
sure is a long cell
</td>
</tr>
</table>
</html>
Если тег <form>
важен, вы все равно можете добавить его после анализа. Например:
>>> new_form = Tag(soup, "form") # create form element
>>> soup.html.insert(0, new_form) # insert form as child of html
>>> new_form.insert(0, soup.table.extract()) # move table into form
>>> print soup.prettify()
<html>
<form>
<table>
<td>
<input name="input1" />
Row 1 cell 1
</td>
<tr>
<td>
Row 2 cell 1
</td>
<td>
Row 2 cell 2
<br />
This
sure is a long cell
</td>
</tr>
</table>
</form>
</html>