2016-08-04 5 views
0

Я соскабливаю некоторые данные с веб-сайтов и столкнулся с проблемой, используя BeautifulSoup (bs4). Мне нужно получить текст некоторых элементов, разделенных чем угодно (запятая, пробел и т. Д.), Что позволяет мне разбить текст так, чтобы он появился.Текст после <br> исчезает после замены br-тегов

text Атрибут bs4.element.Tag дает текстовое содержание. Проблема в том, что я получаю текст конкатенированным, даже если между ними есть <br>. У меня нет возможности дифференцировать, является ли OneTwo одним словом/предложением или множественным.

Я использую find_all, чтобы найти все <br> теги, и я заменяю их запятой ,, поэтому я могу разделить текст на нее. Однако, заменяя br теги, кажется, удаляет текст, который следует за тегами br.

Вот код, который воспроизводит проблему:

from bs4 import BeautifulSoup 

soup = BeautifulSoup(""" 
<html> 
    <head> 
    </head> 
    <body> 
     <div> 
      One 
      <br> 
      Two 
      <br> 
      <br> 
     </div> 
    </body> 
</html> 
""".replace(' ', '').replace('\n', ''), "html.parser") 

print soup.div.text 
# Out: OneTwo 

for br in soup.find_all('br'): 
    br.replace_with(',') 

print soup.text.replace('\n', '') 
# Out: One, 

То, что я хочу, чтобы напечатать это One,Two или One,Two,, или что-то подобное вместо этого. Как заменить теги br символом, не удаляя при этом другой текст?

+0

Вы можете попробовать '' divText = [слово в слово в soup.div.split ('
'), если слово] '' –

+0

Как уже говорилось, это по-прежнему не разделяет отдельные слова. Я не знаю, есть ли одно слово или нет. –

+0

Отредактировано, пожалуйста, посмотрите еще раз. –

ответ

0

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

Если кто-то ищет решение подобной проблемы, я наткнулся на один аккуратный метод, insert, который именно то, что я искал.

from bs4 import BeautifulSoup 

soup = BeautifulSoup(""" 
<html> 
    <head> 
    </head> 
    <body> 
     <div> 
      One 
      <br> 
      Two 
      <br> 
      <br> 
     </div> 
    </body> 
</html> 
""".replace(' ', '').replace('\n', ''), "html.parser") 

for br in soup.find_all('br'): 
    br.insert(0, ',') 

print soup.text.replace('\n', '') 
# Out: One,Two,, 

Редактировать

Даже лучшее решение, которое предложил Padraic Каннингем просто сцепить текст br для замены, которая сохранит первоначальный текст.

from bs4 import BeautifulSoup 

soup = BeautifulSoup(""" 
<html> 
    <head> 
    </head> 
    <body> 
     <div> 
      One 
      <br> 
      Two 
      <br> 
      <br> 
     </div> 
    </body> 
</html> 
""".replace(' ', '').replace('\n', ''), "html.parser") 

for br in soup.find_all('br'): 
    br.replace_with(',' + br.text) 

print soup.text.replace('\n', '') 
# Out: One,Two 
+1

'br.replace_with (", "+ br.text)' –

+0

О, хорошо. Отправьте это как ответ, и я его приму. Никогда не думал, что 'br.text' будет содержать фактический текст. –

+0

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