Проблема с заменой тегов <br>на новую строку с помощью bs4 - PullRequest
0 голосов
/ 09 октября 2018

Проблема: Я не могу заменить <br> теги символом новой строки, используя Beautiful Soup 4.

Код: Моя программа (соответствующая ее часть)в настоящее время выглядит как

for br in board.select('br'):
    br.replace_with('\n')

, но я также попытался board.find_all() вместо board.select().

Результаты: Когда я использую board.replace_with('\n') все <br> теги заменяются строковым литералом \n.Например, <p>Hello<br>world</p> в конечном итоге станет Hello\nworld.Использование board.replace_with(\n) вызывает ошибку

File "<ipython-input-27-cdfade950fdf>", line 10
    br.replace_with(\n)
                       ^
SyntaxError: unexpected character after line continuation character

Другая информация: Я использую ноутбук Jupyter, если это имеет какое-либо отношение.Вот моя полная программа, так как в другом месте я мог не заметить некоторые проблемы.

import requests
from bs4 import BeautifulSoup
import pandas as pd

page = requests.get("https://boards.4chan.org/g/")
soup = BeautifulSoup(page.content, 'html.parser')
board = soup.find('div', class_='board')

for br in board.select('br'):
    br.replace_with('\n')

message = [obj.get_text() for obj in board.select('.opContainer .postMessage')]
image = [obj['href'] for obj in board.select('.opContainer .fileThumb')]
pid = [obj.get_text() for obj in board.select('.opContainer .postInfo .postNum a[title="Reply to this post"]')]
time = [obj.get_text() for obj in board.select('.opContainer .postInfo .dateTime')]

for x in range(len(image)):
    image[x] = "https:" + image[x]

post = pd.DataFrame({
    "ID": pid,
    "Time": time,
    "Image": image,
    "Message": message,
    })
post

pd.options.display.max_rows
pd.set_option('display.max_colwidth', -1)

display(post)

Буду признателен за любой совет.Спасибо за чтение.

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

После экспериментов с вариациями

page = requests.get("https://boards.4chan.org/g/")
str_page = page.content.decode()
str_split = '\n<'.join(str_page.split('<'))
str_split = '>\n'.join(str_split.split('>'))
str_split = str_split.replace('\n', '')
str_split = str_split.replace('<br>', ' ')
soup = BeautifulSoup(str_split.encode(), 'html.parser')

в течение большей части двух часов я определил, что фрейм данных Panda печатает символ новой строки в виде строкового литерала.Все остальное указывает на то, что программа работает так, как задумано, поэтому я предполагаю, что это было проблемой с самого начала.

0 голосов
/ 09 октября 2018

Вместо замены после конвертации в суп, попробуйте заменить теги <br> перед конвертацией.Мол,

soup = BeautifulSoup(str(page.content).replace('<br>', '\n'), 'html.parser')

Надеюсь, это поможет!Ура!

PS: У меня не было логической причины, почему это не работает после превращения в суп.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...