Можно ли использовать суповой объект bs4 с lxml? - PullRequest
0 голосов
/ 13 сентября 2018

Я пытаюсь использовать как BS4, так и lxml, поэтому вместо того, чтобы дважды анализировать html-страницу, есть ли способ использовать суп-объект в lxml или наоборот?

self.soup = BeautifulSoup(open(path), "html.parser")

Я пытался использовать этот объект с lxmlкак это

 doc = html.fromstring(self.soup)

это ошибка сгенерирования TypeError: expected string or bytes-like object

есть ли способ получить этот тип использования?

1 Ответ

0 голосов
/ 13 сентября 2018

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

from bs4 import BeautifulSoup
import lxml.html

html = """
<html><body>
<div>
<p>test</p>
</div>
</body></html>
"""
soup = BeautifulSoup(html, 'html.parser')
# Soup to lxml.html
doc = lxml.html.fromstring(soup.prettify())
print (type(doc))
print (lxml.html.tostring(doc))
#lxml.html to soup
soup = BeautifulSoup(lxml.html.tostring(doc), 'html.parser')
print (type(soup))
print (soup.prettify())

Выходы:

<class 'lxml.html.HtmlElement'>
b'<html>\n <body>\n  <div>\n   <p>\n    test\n   </p>\n  </div>\n </body>\n</html>'
<class 'bs4.BeautifulSoup'>
<html>
 <body>
  <div>
   <p>
    test
   </p>
  </div>
 </body>
</html>

Обновлено в ответ на комментарий:

Вы можете использовать lxml.etree для перебора объекта doc:

# Soup to lxml.etree
doc = etree.fromstring(soup.prettify())
it = doc.getiterator()
for  element in it:
    print("%s - %s" % (element.tag, element.text.strip()))
...