我正在使用beautifulsoup4和python 3。
我试图刮擦具有以下结构的网页的一部分:
<h1>Main Title Here<br/>
<small>
Subtitle Here -
More Pieces of Subtitle Here</small>
</h1>
到目前为止,我已经尝试了:
- 打印整个元素
print(soup.find('h1').text)
的文本 - 此印刷品具有多余的空间,因此难以进行制造。 - 抓住元素的内容 - 这似乎产生了结果与文本相同
so,在我的输出上方的两种方法上看起来都这样:
主要标题在这里多个空间此处的多个空间字幕这里 - 此处的多个空间在这里有更多字幕
这些都返回文本,并在许多空间中返回文本。我已经尝试了以下内容来清理返回的数据:
- 使用替换()和strip()
- 但是,将其清洗一点,但是,剥离只能去除最外面的空间并替换具有去除所有空间的潜力(我不想要) - 使用分解()和提取()
- 这从在"small"
标签中并返回<none>
标签。
我希望输出看起来像这样:
(第1行)这里的主要标题
(第2行)在这里字幕 - 此处更多的字幕
否则这也将有效:
(1行)这里的主要标题,副标题 - 此处更多的字幕
基本上,我需要将其凝结成一条或两条没有多余空间的线,所有的HTML标签都被剥离。
根据我在这里其他地方阅读的内容,我要么需要使用for循环来迭代该页面的一小部分(还需要将"查找"更改为" 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)
我建议您依靠标题内的标签,而不是在线路中断:
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'