【问题标题】:Unable to extract text in the immediate level using BeautifulSoup无法使用 BeautifulSoup 在直接级别中提取文本
【发布时间】:2017-03-05 03:30:37
【问题描述】:

我按照这个方法通过使用 find(text=True, recursive=False) 从标签的直接级别提取文本,正如另一个 answer 中提到的那样,但是对于像 u'<p>\n <strong>\n Established\n </strong>\n 1865\n</p>\n' 这样的一些特定标记,它不起作用:

代码如下:

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 文件中随机去除所有换行符并不是一个好主意。

还有其他解决方案吗?

【问题讨论】:

  • 您可以使用正则表达式预处理 html 以查找所有 \n 前导和尾随字符串,然后将其删除

标签: python beautifulsoup


【解决方案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

【讨论】:

    【解决方案2】:

    您可以在使用bs4 之前处理您的标记一次,然后find 适用于所有标签

    首先制作正则表达式模式:r = re.compile('(^[\s]+)|([\s]+$)', re.MULTILINE)

    第二次删除前导和尾随空格markup = re.sub(r, '', markup)

    第三个用空格替换新行markup = re.sub('\n', ' ', markup)

    第四次删除打开标签前的空格markup = re.sub('[\s]+&lt;', '&lt;', markup)

    第五次删除关闭标签后的空格markup = re.sub('&gt;[\s]+', '&gt;', 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'
    

    【讨论】:

      猜你喜欢
      • 2014-06-16
      • 1970-01-01
      • 2015-09-29
      • 1970-01-01
      • 2017-11-10
      • 2020-11-10
      • 1970-01-01
      • 2020-10-09
      • 1970-01-01
      相关资源
      最近更新 更多