python - BS4 如何在不使用 .text 的情况下获取文本?

标签 python html html-parsing beautifulsoup

这是网站的源代码布局:

<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> 的功能东西。我找不到名为 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 ')

最佳答案

您可以找到 br 分隔符标记并在其周围获取 siblings:

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'

关于python - BS4 如何在不使用 .text 的情况下获取文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33359585/

相关文章:

css - <div> 也没有出现在另一个 div 中

html - 如何复制(或立即反射(reflect))在浏览器上检查元素上编辑的 CSS 到实际的 css 文件?

javascript - 对数表示

python - 使用 Python 正则表达式查找两个变量之间的 HTML

python - 使用 Python 将 HTML 转换为 RTF 字符串

python - theano( python ): elementwise gradient

python - tf.select 有什么用

python - 在 kivy-Garden-Mapview 的 python 端(不在 kv 文件中)的 MapMarkerPopup 中创建 Popup

python - 为命令行选项指定无限数量的参数

java - 如何使用 AND 操作创建 Jsoup 选择器?