2015-10-27 97 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> 

我想获得的街道号码,路线,以及城市地理编码谷歌。如果我这样做

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

它带走了<br />,我离开了,没有办法从分裂城市的航线。如果我做str().replace('<br />',', ')那么我必须以某种方式将其再次转换为之前的任何类型,因此我可以使用.text来获取<a href>之间的实际文本,效率很低。我想使用.text用于获取实际文本的功能,但没有删除<br>内容的功能。我在env找不到一个名为BeautifulSoup.py的文件,所以我正在查看GitHub上的BeautifulSoup源代码,并且在那里我找不到def text,我不知道在哪里可以看到。

更新:

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( '格',{ '类': '地址'})。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谢谢,你也可以使用'replace_with()' - 更新,检查出来。 – alecxe

+0

我有一个关于'replace_with()'的问题,我注意到它正在改变'
'在汤和'a'中。在文档中它表示它将一个字符串替换为另一个字符串,这是否意味着'replace_with()'每次都复制整个汤并删除旧的字符串? – dtgq

0

尝试:

for link_to_text in links: 
    Print link_to_text.get_text() 
相关问题