【问题标题】:Search and Replace in HTML with BeautifulSoup使用 BeautifulSoup 在 HTML 中搜索和替换
【发布时间】:2011-01-05 14:57:47
【问题描述】:

我想使用 BeautfulSoup 搜索 <\a> 并将其替换为 <\a><br>。我知道如何使用urllib2 打开然后解析以提取所有<a> 标签。我想要做的是搜索并用结束标签加上中断替换结束标签。任何帮助,非常感谢。

编辑

我认为它类似于:

soup.findAll('a').

在文档中,有一个:

find(text="ahh").replaceWith('Hooray')

所以我认为它会是这样的:

soup.findAll(tag = '</a>').replaceWith(tag = '</a><br>')

但这不起作用,python help() 并没有提供太多帮助

【问题讨论】:

    标签: python beautifulsoup


    【解决方案1】:

    假设你有一个你知道包含“br”标记的元素,用不同的字符串删除和替换“br”标记的一种方法是这样的:

    originalSoup = BeautifulSoup("your_html_file.html")
    replaceString = ", " # replace each <br/> tag with ", "
    # Ex. <p>Hello<br/>World</p> to <p>Hello, World</p>
    cleanSoup = BeautifulSoup(str(originalSoup).replace("<br/>", replaceString))
    

    【讨论】:

    • 它有帮助。谢谢:)
    【解决方案2】:

    这将在每个&lt;a&gt;...&lt;/a&gt; 元素的末尾插入一个&lt;br&gt; 标签:

    from BeautifulSoup import BeautifulSoup, Tag
    
    # ....
    
    soup = BeautifulSoup(data)
    for a in soup.findAll('a'):
        a.parent.insert(a.parent.index(a)+1, Tag(soup, 'br'))
    

    您不能使用soup.findAll(tag = '&lt;/a&gt;'),因为 BeautifulSoup 不会单独对结束标签进行操作 - 它们被视为同一元素的一部分。


    如果您想按照评论中的要求将 &lt;a&gt; 元素放入 &lt;p&gt; 元素中,您可以使用:

    for a in soup.findAll('a'):
        p = Tag(soup, 'p') #create a P element
        a.replaceWith(p)   #Put it where the A element is
        p.insert(0, a)     #put the A element inside the P (between <p> and </p>)
    

    同样,您不要分别创建 &lt;p&gt;&lt;/p&gt;,因为它们是同一事物的一部分。

    【讨论】:

    • 是否也将其添加到每个打开的 标签中?
    • 查看我的编辑 - 它将添加在整个 ... 元素之后,因此有效地,它只会在 之后。
    • BeautifulSoup.Tag 有效吗?尝试此代码时出现错误。
    • 这取决于你如何导入模块。我进行了编辑以展示它的一种工作方式 - 立即尝试。
    • FWIW 应该是a.parent.content.index
    【解决方案3】:

    您不会替换结束标记;在 BeautifulSoup 中,您正在处理像在浏览器中一样的文档对象模型,而不是充满 HTML 的字符串。因此,如果不替换开始标签,就无法“替换”结束标签。

    您要做的是在&lt;a&gt;...&lt;/a&gt; 元素之后立即插入一个新的&lt;br&gt; 元素。为此,您需要找出&lt;a&gt; 元素在其父元素内的索引,并将新元素插入到该索引之后。例如。

    soup= BeautifulSoup('<body>blah <a href="foo">blah</a> blah</body>')
    for link in soup.findAll('a'):
        br= Tag(soup, 'br')
        index= link.parent.contents.index(link)
        link.parent.insert(index+1, br)
    # soup now serialises to '<body>blah <a href="foo">blah</a><br /> blah</body>'
    

    【讨论】:

    • 我可以在之前添加标签吗?假设我想做

      。我可以在使用索引 -1 之前使用

      并在使用 +1 之后使用

      吗?
    • 您只需使用index 在所选元素之前添加一个元素,而不是加减任何内容。
    猜你喜欢
    • 2014-10-13
    • 2011-09-25
    • 2015-11-23
    • 2012-02-14
    • 2017-01-03
    • 1970-01-01
    • 1970-01-01
    • 2019-01-06
    • 1970-01-01
    相关资源
    最近更新 更多