Получить все ссылки в html, включая условные комментарии - PullRequest
1 голос
/ 07 мая 2020

Предположим, у меня есть этот простой html:

<html>
  <body>

    <!--[if !mso]><!-->
    <a href="http://link1.com">Link 1</a>
    <!--<![endif]-->

    <!--[if mso]>
      <a href="http://link2.com">Link 2</a>
    <![endif]-->

  </body>
</html>

Есть ли способ использовать lxml.html или BeautifulSoup для получения обеих ссылок? Сейчас у меня только один. Другими словами, я хочу, чтобы синтаксический анализатор также изучал условные комментарии html (не уверен, что это за технический термин).

l xml. html

>>> from lxml import html
>>> doc = html.fromstring(s)
>>> list(doc.iterlinks())

<<< [(<Element a at 0x10f7f7bf0>, 'href', 'http://link1.com', 0)]

BeautifulSoup

>>> from BeautifulSoup import BeautifulSoup
>>> b = BeautifulSoup(s)
>>> b.findAll('a')

<<< [<a href="http://link1.com">Link 1</a>]

1 Ответ

2 голосов
/ 07 мая 2020

Нужно вытащить комментарии, а затем проанализировать их.

html = '''<html>
  <body>

    <!--[if !mso]><!-->
    <a href="http://link1.com">Link 1</a>
    <!--<![endif]-->

    <!--[if mso]>
      <a href="http://link2.com">Link 2</a>
    <![endif]-->

  </body>
</html>'''



from bs4 import BeautifulSoup, Comment
soup = BeautifulSoup(html, 'html.parser')

links = soup.find_all('a', href=True)

comments = soup.find_all(string=lambda text: isinstance(text, Comment))
for comment in comments:
    if BeautifulSoup(comment).find_all('a', href=True):
        links += BeautifulSoup(comment).find_all('a', href=True)

print (links)

Вывод:

[<a href="http://link1.com">Link 1</a>, <a href="http://link2.com">Link 2</a>]
...