BeautifulSoup разных парсеров - PullRequest
       1

BeautifulSoup разных парсеров

2 голосов
/ 27 апреля 2019

Может кто-нибудь подробнее рассказать о разнице между парсерами, такими как html.parser и html5lib? Я наткнулся на странное поведение, когда при использовании html.parser он игнорирует все теги в определенном месте. посмотрите на этот код

from bs4 import BeautifulSoup
html = """
<html>
<head></head>
<body>
<!--[if lte IE 8]> <!-- data-module-name="test"--> <![endif]-->
 <![endif]-->
    <a href="test"></a>
    <a href="test"></a>
    <a href="test"></a>
    <a href="test"></a>
   <!--[if lte IE 8]>
  <![endif]-->
  </body>
</html>
"""

soup = BeautifulSoup(html, 'html.parser')
tags = soup.find_all('a')
print(tags)

это вернет пустой список, тогда как при использовании html5lib нужные теги «a» возвращаются, как и ожидалось. Кто-нибудь знает причину этого?

Я прочитал документацию, но объяснение различных парсеров довольно расплывчато ..

Также я заметил, что html5lib игнорирует недопустимые теги, такие как вложенные теги форм, есть ли способ использовать html5lib, чтобы избежать описанного выше поведения с html.parser, а также получать недопустимые теги, такие как вложенные теги форм? (при разборе html5lib один из тегов формы удаляется)

спасибо заранее.

1 Ответ

0 голосов
/ 27 апреля 2019

Вы можете использовать lxml, который очень быстр и может использовать find_all или select, чтобы получить все теги.

from bs4 import BeautifulSoup
html = """
<html>
<head></head>
<body>
<!--[if lte IE 8]> <!-- data-module-name="test"--> <![endif]-->
 <![endif]-->
    <a href="test"></a>
    <a href="test"></a>
    <a href="test"></a>
    <a href="test"></a>
   <!--[if lte IE 8]>
  <![endif]-->
  </body>
</html>
"""

soup = BeautifulSoup(html, 'lxml')
tags = soup.find_all('a')
print(tags)

ИЛИ

from bs4 import BeautifulSoup
html = """
<html>
<head></head>
<body>
<!--[if lte IE 8]> <!-- data-module-name="test"--> <![endif]-->
 <![endif]-->
    <a href="test"></a>
    <a href="test"></a>
    <a href="test"></a>
    <a href="test"></a>
   <!--[if lte IE 8]>
  <![endif]-->
  </body>
</html>
"""

soup = BeautifulSoup(html, 'lxml')
tags = soup.select('a')
print(tags)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...