【问题标题】:BS4 How to get text without using .text?BS4 如何在不使用 .text 的情况下获取文本?
【发布时间】:2015-10-27 03:41:04
【问题描述】:

这是来自网站的源代码布局:

<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'

它带走了&lt;br /&gt;,我无法将路线与城市分开。如果我执行str().replace('&lt;br /&gt;',', '),那么我必须以某种方式将其再次转换回之前的任何类型,以便我可以执行.text 来获取&lt;a href&gt; 之间的实际文本,这是低效的。我想使用.text 用来获取实际文本的功能,而不是删除&lt;br&gt; 内容的功能。我在我的环境中找不到名为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 ')

【问题讨论】:

  • 你可以使用article.find('div', {'class': 'address'}).string
  • 什么也没做,打印为None

标签: python html beautifulsoup html-parsing bs4


【解决方案1】:

您可以找到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'

【讨论】:

  • @vandidant 谢谢,你也可以使用replace_with() - 更新,检查一下。
  • 我有一个关于replace_with() 的问题,我注意到它正在更改汤中的&lt;br&gt; 以及a。在文档中它说它用另一个字符串替换了一个字符串,这是否意味着replace_with() 正在复制整个汤并每次都删除旧的?
  • @vandidant 它应该只用指定的标签或文本替换特定的br。换句话说,在a.br.replace_with(" ") 的情况下,特定a 元素内的单个br 元素将在汤中被替换。不确定解释是否使事情清楚。谢谢。
【解决方案2】:

试试:

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

分隔符关键字定义连接文本的内部 HTML。

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

【讨论】:

  • 这正是我想做的,感谢您的解决方案!
【解决方案3】:

试试:

for link_to_text in links:
   Print link_to_text.get_text()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-10
    • 2012-03-12
    • 2019-04-29
    • 1970-01-01
    • 2016-03-10
    相关资源
    最近更新 更多