Обрабатывать угловую скобку в предварительной метке с помощью BeautifulSoup - PullRequest
0 голосов
/ 22 января 2019

У меня есть такая строка

<code>html = "<pre>City_<cityname>_001
"

При попытке разобрать это с помощью BeautifulSoup 4, используя следующий код,

<code>>>> from bs4 import BeautifulSoup
>>> html = "<pre>City_<cityname>_001
" >>> soup= BeautifulSoup (html, "html.parser") >>> суп
City_<cityname>_001</cityname>
>>> суп.текст Город__001

Как видно, BeautifulSoup рассматривает cityname как новый тег.

Есть ли способ избежать этого, чтобы получить правильный текст и HTML?

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Комментарии игнорируются парсерами.Вы можете сделать содержание <pre> комментарием перед синтаксическим анализом, а затем extract () комментарием позже.

<code>import bs4
html = "<pre>City_<cityname>_001
"soup = bs4.BeautifulSoup (html.replace ("
","<pre><!--").replace("
", "-> "), "lxml") pre = soup.find ('pre') pre_comment = pre.find (text = лямбда-текст: isinstance (text, bs4.Comment)). Extract () print(предварительный комментарий)

Вывод:

City_<cityname>_001
0 голосов
/ 22 января 2019

Это немного хак, но вы можете заменить строки, заключенные в квадратные скобки, а затем отформатировать строку с результатами после:

<code>from bs4 import BeautifulSoup as soup
html = "<pre>City_<cityname>_001
"_html, _vals = re.sub ('(? <= _)) \ <\ w + \> (? = _) ',' {} ', html), re.findall (' (? <= _) \ <\ w + \> (? = _) ', html) new_result =суп (_html, 'html.parser'). find ('pre'). text.format (* _ vals)

Вывод:

'City_<cityname>_001'
...