【问题标题】:Is it possible to get the following information from BeautifulSoup without a loop or additional module?是否可以在没有循环或附加模块的情况下从 BeautifulSoup 获取以下信息?
【发布时间】:2019-02-19 00:22:38
【问题描述】:

我正在使用 BeautifulSoup4 和 Python 3。

我正在尝试抓取具有以下结构的网页的一部分:

<h1>Main Title Here<br/>

<small>
Subtitle Here - 
More Pieces of Subtitle Here</small>
</h1>

到目前为止,我已经尝试过:

  • 打印整个元素print(soup.find('h1').text)的文本 --这打印有多余的空间,使其难以操作。
  • 抓取元素的内容 --这似乎产生了 结果与文本相同

因此,使用上面的两种方法,我的输出如下所示:

此处为主标题此处为多个空格 这里有多个空格这里有字幕 - 这里有多个空格这里有多个空格这里有更多字幕

它们都返回带有换行符和大量空格的文本。我尝试了以下方法来清理返回的数据:

  • 使用 Replace() 和 Strip()
    --这会稍微清理一下,但是, strip 仅删除最外面的空格,而 replace 有可能删除所有空格 (我不想要)
  • 使用 Decompose() 和 Extract()
    --这删除了所有内容 在"small" 标签内并返回&lt;none&gt; 标签。

我希望输出如下所示:
(第 1 行)此处的主标题
(第 2 行)这里的字幕 - 这里有更多的字幕

或者这也可以:
(1 行) 主标题在这里,副标题在这里 - 更多的副标题在这里

基本上,我需要将其压缩为一两行,没有多余的空格,并剥离所有 html 标签。

根据我在这里其他地方读到的内容,我要么需要使用 for 循环来遍历页面的这一小块(据我所知,这还需要将“Find”更改为“FindAll”,或者,我需要导入 re 模块。

有没有办法在不使用循环或导入模块的情况下达到我想要的结果?

以下是我尝试过的其他一些事情(几乎没有成功):

#Grabbing element, then next element separately
    print(soup.findAll('h1')[0].next)
    h=(soup.findAll('small')[0].next)
    h=h.replace('\n', '')
    print(h.strip())

#Grabbing by div and looping through
    i = soup.find('div', attrs={'page-header'})
    children = i.findChildren()
    for child in children:
         print(child)

【问题讨论】:

    标签: python python-3.x beautifulsoup


    【解决方案1】:

    我建议你依赖标题中的标签而不是换行符:

    h1 = soup.find('h1')
    list(h1.strings)[0] # The first string of the header
    #'Main Title Here'
    h1.find('small').string.strip() # The string in <small>
    #'Subtitle Here - \nMore Pieces of Subtitle Here'
    

    【讨论】:

    • 感谢您的反馈!试过了,不幸的是,即使我重新添加“替换”,它似乎也无法处理所有的中断和空格。我会尝试更多的变化,看看我是否可以让它工作。
    猜你喜欢
    • 1970-01-01
    • 2013-01-23
    • 1970-01-01
    • 2010-10-23
    • 2018-09-21
    • 2015-03-27
    • 1970-01-01
    • 2013-11-07
    • 2013-08-21
    相关资源
    最近更新 更多