【问题标题】:Using BeautifulSoup to parse lines separated by <br> tags?使用 BeautifulSoup 解析由 <br> 标签分隔的行?
【发布时间】:2011-01-19 07:08:02
【问题描述】:

我有一个如下所示的页面:

Company A<br />
123 Main St.<br />
Suite 101<br />
Someplace, NY 1234<br />
<br />
<br />
<br />
Company B<br />
456 Main St.<br />
Someplace, NY 1234<br />
<br />
<br />
<br />

有时有两个而不是三个“br”标签分隔条目。我将如何使用 BeautifulSoup 解析此文档并提取字段?我很困惑,因为我需要的文本位不包含在我可以简单地遍历的段落(或类似)标签中。

【问题讨论】:

    标签: python parsing beautifulsoup


    【解决方案1】:

    我有更棘手的问题。这就是我解决的方法

    html=html.replace('<br>','<br />')
    

    【讨论】:

      【解决方案2】:

      您应该查看标签中的.stringsattribute,然后在其上使用“\n”.join()。

      【讨论】:

        【解决方案3】:

        也许你可以使用这个功能:

        def partition_by(pred, iterable):
            current = None
            current_flag = None
            chunk = []
            for item in iterable:
                if current is None:
                    current = item
                    current_flag = pred(current)
                    chunk = [current]
                elif pred(item) == current_flag:
                    chunk.append(item)
                else:
                    yield chunk
                    current = item
                    current_flag = not current_flag
                    chunk = [current]
            if len(chunk) > 0:
                yield chunk
        

        添加一些内容以检查是否是 &lt;br /&gt; 标记或换行符:

        def is_br(bs):
            try:
                return bs.name == u'br'
            except AttributeError:
                return False
        
        def is_br_or_nl(bs):
            return is_br(bs) or u'\n' == bs
        

        (或者其他更合适的...我不太喜欢 BeautifulSoup。)

        然后使用partition_by(is_br_or_nl, cs) 产生(对于cs 设置为BeautifulSoup.BeautifulSoup(your_example_html).childGenerator())

        [[u'Company A'],
         [<br />],
         [u'\n123 Main St.'],
         [<br />],
         [u'\nSuite 101'],
         [<br />],
         [u'\nSomeplace, NY 1234'],
         [<br />, u'\n', <br />, u'\n', <br />, u'\n', <br />],
         [u'\nCompany B'],
         [<br />],
         [u'\n456 Main St.'],
         [<br />],
         [u'\nSomeplace, NY 1234'],
         [<br />, u'\n', <br />, u'\n', <br />, u'\n', <br />]]
        

        这应该很容易处理。

        为了概括这一点,您可能必须编写一个谓词来检查它的参数是否是您关心的东西......然后您可以将它与partition_by 一起使用,以将其他所有内容集中在一起。请注意,您关心的事情也被归为一类——基本上,您必须处理生成的生成器生成的第二个列表中的每一项,从包含您关心的事情的第一个列表开始。

        【讨论】:

          【解决方案4】:

          您可以先进行一些操作,然后再进行任何操作。例如,将所有换行符更改为空白,然后将出现 2 次或更多的 &lt;br /&gt; 替换为其他分隔符,如 |。之后你就可以得到你的字段了。

          html="""
          Company A<br />
          123 Main St.<br />
          Suite 101<br />
          Someplace, NY 1234<br />
          <br />
          <br />
          <br />
          Company B<br />
          456 Main St.<br />
          Someplace, NY 1234<br />
          <br />
          <br />
          <br />
          """
          import re
          newhtml=html.replace("\n","")
          pat=re.compile("(<br \/>){2,}",re.DOTALL|re.M)
          print pat.sub("|",newhtml)
          

          输出

          $ ./python.py
          Company A<br />123 Main St.<br />Suite 101<br />Someplace, NY 1234|Company B<br />456 Main St.<br />Someplace, NY 1234|
          

          现在您的公司信息由管道分隔。

          【讨论】:

            【解决方案5】:

            一旦你有了这个 HTML 片段,只需使用正则表达式替换 &lt;br /&gt;,然后用一个换行符替换可选的换行符,然后拆分为多个换行符。这应该会导致您可以手动处理多个单独的段落。

            【讨论】:

            • 感谢您的回答,但不幸的是它并不像使用正则表达式那么简单。我已经简化了上述文档以更好地说明我的问题。实际的文档有一堆乱七八糟的 HTML 格式标签等。
            • 但是您并不关心文档,只关心由&lt;br /&gt;标签分隔的部分。首先使用 BeatifulSoup 提取该部分。
            • 我不知道为什么有人不赞成你的回答;我很感激帮助。我会根据你的建议尝试几个想法。我只是希望 BeautifulSoup 可以消除手动解析的需要。谢谢。
            • BeautifulSoup 适用于处理结构和样式的标签,但&lt;br /&gt; 不属于其中任何一个。
            • 虽然我可能更愿意使用 Michal 的答案,但直到我完成我的项目后才看到它。使用您的建议,我能够做我需要的事情。谢谢。
            猜你喜欢
            • 2017-09-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-05-16
            • 2013-03-20
            • 2020-04-22
            相关资源
            最近更新 更多