Невозможно получить данные из Unicode между двумя символами - PullRequest
0 голосов
/ 23 мая 2018

При разборе html

<div>
<h3>
    <small style="text-align:left;color:gray;">05/23 13:58頃</small> 
    <small>苫小牧市</small><br>
    (支援)苫小牧市新富町1丁目
</h3> 

я должен получить данные из маленькой скобки '()' как 支援 в python.Когда я пытаюсь получить данные по команде

text = div.h3.findAll(text=True, recursive=False)[2].strip()

Я получаю

u'\uff08\u652f\u63f4\uff09\u82eb\u5c0f\u7267\u5e02\u65b0\u5bcc\u753a1\u4e01\u76ee'

Это данные Unicode '(支援)苫小牧市新富町1丁目', поэтому я не могу получить данные из маленькой скобкикак '支援'

1 Ответ

0 голосов
/ 23 мая 2018

BeautifulSoup не поможет вам разобрать подстроки.Вы можете использовать строковые методы Python для обработки этого или использовать регулярное выражение.

Открывающая и закрывающая скобки здесь - это круглые скобки U + FF08 и U + FF09, вы можете разбить строку на них:

text.partition(u'\uff08')[-1].partition(u'\uff09')[0]

или вы можете использовать регулярное выражение, которое переводит весь текст между двумя такими кодовыми точками:

re.search(ur'\uff08([^\uff09]*)\uff09', text).group(1)

Они оба работают для вашей строки образца:

>>> print text.partition(u'\uff08')[-1].partition(u'\uff09')[0]
支援
>>> import re
>>> print re.search(ur'\uff08([^\uff09]*)\uff09', text).group(1)
支援

Разница заключается в том, как они обрабатывают строки без одной или обеих этих скобок;re.search() вернет None в этих случаях, и вы получите AttributeError за попытку использовать .group для этого объекта, в то время как str.partition() создаст либо пустую строку, либо частичную строку:

>>> text = u'no parentheses'
>>> text.partition(u'\uff08')[-1].partition(u'\uff09')[0]
u''
>>> text = u'\uff08open parentheses'
>>> text.partition(u'\uff08')[-1].partition(u'\uff09')[0]
u'open parentheses'
>>> text = u'close parentheses\uff09'
>>> text.partition(u'\uff08')[-1].partition(u'\uff09')[0]
u''

Выберите метод, который наилучшим образом соответствует вашим потребностям.

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