2015-10-27 3 views
1

Это расположение исходного кода с сайта:BS4 Как получить текст без использования .text?

<div class="address"> 
    <a href="https://website.ca/classifieds/59-barclay-street/"> 
     59 Some Street<br />City, Zone 1 
    </a> 
</div> 

Я хотел бы получить номер улицы, маршрут, и город для Google геокодирования. Если я делаю это

>>>article.find('div', {'class': 'address'}).text 
'59 Some StreetCity, Zone 1' 

Он забирает <br /> и я остался без возможности разделить маршрут от города. Если я сделаю str().replace('<br />',', '), то мне нужно как-то преобразовать его обратно в любой тип, который был до этого, поэтому я могу сделать .text, чтобы получить фактический текст между <a href>, он неэффективен. Я хотел бы использовать функциональность, которую использует .text, чтобы получить фактический текст без функциональности, где он удаляет <br>. Я не мог найти файл под названием BeautifulSoup.py в моем env, поэтому я смотрю на исходный код BeautifulSoup на GitHub, и я не могу найти def text там, я не знаю, где еще искать.

Update:

articles = page_soup.find('h2', text='Ads').find_next_siblings('article') 
for article in articles: 
    link = article.find('a') 
    br = link.find('br') 
    ad_address = br.previous_sibling.strip() + ', ' + br.next_sibling.strip().partition(', Zone ')[0] 
    #ad_address = link.br.replace_with(', ').get_text().strip().partition(', Zone ') 
+0

вы можете использовать 'article.find ('DIV', { 'класс': 'адрес'}). String' –

+0

Это ничего не делать, и печатает как «Нет» – dtgq

ответ

3

Вы можете найти br разделителей тег и получить братьев и сестер вокруг него:

In [4]: br = soup.select_one("div.address > a > br") 

In [5]: br.previous_sibling.strip() 
Out[5]: u'59 Some Street' 

In [6]: br.next_sibling.strip() 
Out[6]: u'City, Zone 1' 

Вы также можете найти br элемент и заменить его пробел с использованием replace_with():

In [4]: a = soup.select_one("div.address > a") 
In [5]: a.br.replace_with(" ") 

In [6]: a.get_text().strip() 
Out[6]: u'59 Some Street City, Zone 1' 

Или, вы можете объединить все текстовые узлы внутри a тега:

In [7]: a = soup.select_one("div.address > a") 
In [8]: " ".join(a.find_all(text=True)).strip() 
Out[8]: u'59 Some Street City, Zone 1' 
+0

Это сработало, спасибо. Ты в этом хорош! – dtgq

+0

@vandidant thanks, вы также можете использовать 'replace_with()' - обновленный, проверьте его. – alecxe

+0

У меня вопрос о 'replace_with()', я заметил, что он менял '
' в супе, а также в 'a'. В документах говорится, что он заменяет одну строку на другую, означает ли это, что 'replace_with()' копирует весь суп и каждый раз удаляет старый? – dtgq

1

Try:

soup.find('div', {'class':'address'}).get_text(separator=u"<br/>").split(u'<br/>') 

Сепаратор ключевое слово определяет внутренний HTML, который сцепляет текст.

http://omz-software.com/pythonista/docs/ios/beautifulsoup_ref.html

+0

Это делает именно то, что я хотел сделать, спасибо за решение! – dtgq

Смежные вопросы