是否可以从BeautifulSoup获得以下信息而无需循环或附加模块?

时间:2019-02-19 00:22:38

标签: python python-3.x beautifulsoup

我正在使用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()
    -这样可以将其清理干净一点,但是,条带只会去除最外面的空间,而替换有可能去除所有空间 (我不想要)
  • 使用Decompose()和Extract()
    -这删除了所有内容 在"small"标签中并返回<none>标签。

我希望输出看起来像这样:
(第1行)此处的主标题
(第2行)此处的字幕-这里有更多的字幕

或者这也可以工作:
(1行)主要标题在这里,字幕在这里-更多字幕在这里

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

根据我在其他地方阅读的内容,我要么需要使用for循环来迭代页面的这一小部分(就我所知,这还需要将“查找”更改为“查找全部”,或者,我需要导入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)

1 个答案:

答案 0 :(得分:0)

我建议您依靠标题中的标签,而不是换行符:

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'