我按照此方法使用另一个answer中提到的find(text=True, recursive=False)
从标记的直接级别提取文本,但对于某些特定标记,例如u'<p>\n <strong>\n Established\n </strong>\n 1865\n</p>\n'
它&#39 ; s不工作:
以下是代码:
markup = u'<p>\n <strong>\n Established\n </strong>\n 1865\n</p>\n'
s = BeautifulSoup(markup, 'lxml')
print s.find('p').find(text=True, recursive=False)
打印
45: u'\n'
如果我从标记中删除所有换行符\n
,它的工作正常,但我不认为随机删除所有换行符是个好主意整个HTML文件。
还有其他解决方案吗?
答案 0 :(得分:1)
find
仅返回第一场比赛。您需要使用find_all
:
print(s.find('p').find_all(text=True, recursive=False))
['\n', '\n 1865\n']
根据需要处理它。例如,剥离数据并将片段连接到最终文本中:
data = s.find('p').find_all(text=True, recursive=False)
text = ' '.join(i.strip() for i in data)
print(text)
1865
答案 1 :(得分:0)
您可以在使用bs4
之前处理您的标记一次,然后find
可以正常使用所有标记
首先制作正则表达式模式:r = re.compile('(^[\s]+)|([\s]+$)', re.MULTILINE)
第二个删除前导和尾随空格markup = re.sub(r, '', markup)
第三个用空格markup = re.sub('\n', ' ', markup)
第四个在打开标签markup = re.sub('[\s]+<', '<', markup)
在关闭代码markup = re.sub('>[\s]+', '>', markup)
把所有人放在一起:
>>> def pre_html(markup):
r = re.compile('(^[\s]+)|([\s]+$)', re.MULTILINE)
markup = re.sub(r, '', markup)
markup = re.sub('\n', ' ', markup)
markup = re.sub('[\s]+<', '<', markup)
markup = re.sub('>[\s]+', '>', markup)
return markup
>>> markup = u'<p>\n <strong>\n Established\n </strong>\n 1865\n</p>\n'
>>> pre_html(markup)
u'<p><strong>Established</strong>1865</p>'
然后你的代码应该正常工作:
>>> markup = u'<p>\n <strong>\n Established\n </strong>\n 1865\n</p>\n'
>>> soup=BeautifulSoup(pre_html(markup),"html.parser")
>>> soup.find('p').find(text=True, recursive=False)
u'1865'