как хранить красивый тег внутри супа в виде строки - PullRequest
1 голос
/ 01 апреля 2019

Не уверен, что я пропускаю, но у меня есть относительно простая проблема.

Я очищаю страницу, содержащую пару тегов статьи, которые я называю так (упрощенная версия):

soup = BeautifulSoup(page, 'lxml')
articles = soup.find_all("article", "product-tile promotion")

for a in articles:
   print(a)

# This nicely prints all of my article tags and it's inner html, so up to here all is ok

str = ''.join(articles)

# Here things obviously go wrong, as I am trying to converse a bs4 tag to a string, and that's not supported...

file_name = 'list.xml'
complete_name = os.path.join(user_path, file_name)
file_object = codecs.open(complete_name, "w", "utf-8")
file_object.write(str)

Я могу печатать статьи, и они показывают мне именно то, что мне нужно. Но затем я застреваю, когда хочу записать все эти статьи в одну строку, так как хочу сохранить полный внутренний HTML-код в отличие от обычных текстовых решений, которые можно найти.

Итак, мой реальный вопрос: как я могу сохранить свои теги такими, какие они есть (не только текст, но включая все элементы и атрибуты, которые нужно найти), чтобы я мог сохранить это как xml?

Ответы [ 2 ]

1 голос
/ 01 апреля 2019

Если мое понимание хорошее, вы хотите напечатать весь ваш тег articles, а не только текст, в XML-файле, верно?

В этом случае вы можете попробовать это: сначала вы сохраняете статьи в списке, затем печатаете каждый элемент в цикле с приведением str:

soup = BeautifulSoup(page, 'lxml')
articles = soup.find_all("article", "product-tile promotion")

articles_list = []
for a in articles:
    articles_list.append(a)
    #print(a)

# This nicely prints all of my article tags and it's inner html, so up to here all is ok

#str = ''.join(articles)

# Here things obviously go wrong, as I am trying to converse a bs4 tag to a string, and that's not supported...

file_name = 'list.xml'
complete_name = os.path.join(user_path, file_name)
file_object = codecs.open(complete_name, "w", "utf-8")
for al in articles_list:
    file_object.write(str(al))

EDIT: Или можно просто использовать первый список:

soup = BeautifulSoup(page, 'lxml')
articles = soup.find_all("article", "product-tile promotion")

file_name = 'list.xml'
complete_name = os.path.join(user_path, file_name)
file_object = codecs.open(complete_name, "w", "utf-8")
for a in articles:
    file_object.write(str(a))
0 голосов
/ 01 апреля 2019

find_all возвращает список bs4.element.Tag элементов, а не список строк.Вы можете привести каждый элемент к строке.

Попробуйте заменить

for a in articles:
   print(a)

на

for i in range(len(articles)):
   articles[i] = str(articles[i])
   print(articles[i])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...