У меня есть следующий код для анализа HTML. Мне нужно сохранить вывод (результат html) в виде одной строки кода с последовательностями экранированных символов, такими как \n, но я либо получаю представление, которое не могу использовать из repr() из-за одинарные кавычки или выходные данные записываются в несколько строк следующим образом (интерпретация escape-последовательностей):

<section class="prog__container">
 <span class="prog__sub">Title</span>
 <p>PEP 336 - Make None Callable</p>
 <span class="prog__sub">Description</span>
 <p>
 <p>
 <code>
      None
     </code>
     should be a callable object that when called with any
 arguments has no side effect and returns
     <code>
      None
     </code>
     .
    </p>
 </p>
 </section>

Что мне требуется (включая escape-последовательности):

<section class="prog__container">\n <span class="prog__sub">Title</span>\n <p>PEP 336 - Make None Callable</p>\n <span class="prog__sub">Description</span>\n <p>\n <p>\n <code>\n      None\n     </code>\n     should be a callable object that when called with any\n arguments has no side effect and returns\n     <code>\n      None\n     </code>\n     .\n    </p>\n </p>\n </section>

Мой код

soup = BeautifulSoup(html, "html.parser")

for match in soup.findAll(['div']):
    match.unwrap()

for match in soup.findAll(['a']):
    match.unwrap()

html = soup.contents[0]
html = str(html)
html = html.splitlines(True)
html = " ".join(html)
html = re.sub(re.compile("\n"), "\\n", html)
html = repl(html) # my current solution works, but unusable

Выше мое решение, но представление объекта не годится, мне нужно представление строки. Как мне этого добиться?

2
lkdjf0293 12 Янв 2017 в 18:22

3 ответа

Лучший ответ

Почему бы не использовать просто repr?

a = """this is the first line
this is the second line"""
print repr(a)

Или даже (если я уточню с вашей проблемой точного вывода без буквальных кавычек)

print repr(a).strip("'")

Выход:

'this is the first line\nthis is the second line'
this is the first line\nthis is the second line
1
Nikolay Prokopyev 12 Янв 2017 в 15:38
import bs4

html = '''<section class="prog__container">
 <span class="prog__sub">Title</span>
 <p>PEP 336 - Make None Callable</p>
 <span class="prog__sub">Description</span>
 <p>
 <p>
 <code>
      None
     </code>
     should be a callable object that when called with any
 arguments has no side effect and returns
     <code>
      None
     </code>
     .
    </p>
 </p>
 </section>'''
soup = bs4.BeautifulSoup(html, 'lxml')
str(soup)

Вне:

'<html><body><section class="prog__container">\n<span class="prog__sub">Title</span>\n<p>PEP 336 - Make None Callable</p>\n<span class="prog__sub">Description</span>\n<p>\n</p><p>\n<code>\n      None\n     </code>\n     should be a callable object that when called with any\n arguments has no side effect and returns\n     <code>\n      None\n     </code>\n     .\n    </p>\n</section></body></html>'

Существует более сложный способ вывода html-кода в документ

2
宏杰李 12 Янв 2017 в 15:26
from bs4 import BeautifulSoup
import urllib.request

r = urllib.request.urlopen('https://www.example.com')
soup = BeautifulSoup(r.read(), 'html.parser')
html = str(soup)

Это даст ваш HTML в виде одной строки и строк, разделенных \ n

0
wolfcubman 12 Янв 2017 в 15:53