使用 Python 替换 HTML 文档中的 HTML 标记,而不修改文档的其余部分

Replace an HTML tag in an HTML document using Python without modifying the rest of the document

提问人:Irina Shishilova 提问时间:9/18/2023 最后编辑:Irina Shishilova 更新时间:9/18/2023 访问量:42

问:

我正在制作一个简单的 Python + HTML 网站(作为我研究的一部分)。网站菜单如下所示:

<ul>
    <li><a href="/">Home</a></li>
    <li><a href="/products.html">Products</a></li>
    <li><a href="/about.html">About</a></li>
</ul>

该块存储在变量中,当生成任何页面时,其他内容将连接到该变量,并将生成的页面传输到客户端(浏览器)。

我正在尝试让当前打开的菜单项变粗(添加 B 标签)并删除链接(删除 A 标签)。例如,如果打开了“产品”页面,则菜单应更改为:

<ul>
    <li><a href="/">Home</a></li>
    <li><b>Products</b></li>
    <li><a href="/about.html">About</a></li>
</ul>

我尝试了 HTMLParserBeautifulSoup,但我不明白如何只更改 HTML 的某些部分,而不是破坏整个 HTML。

python html 解析

评论


答:

2赞 Pavel Geveiler 9/18/2023 #1

我建议使用BeautifulSoup。让我们做一个 Python 函数。

def get_menu_html(current_page_name):
    # each <li> tag has its own ID
    html = """
        <ul>
            <li id="menu_home"><a href="/">Home</a></li>
            <li id="menu_products"><a href="/products.html">Products</a></li>
            <li id="menu_about"><a href="/about.html">About</a></li>
        </ul>
    """

    soup = BeautifulSoup(html, "html.parser")

    # find the tag <li> by ID
    tag = soup.find(id="menu_" + current_page_name)

    # create a new tag <b> with the same text as in <li>
    newtag = soup.new_tag("b")
    newtag.string = tag.get_text()

    # replace <a> inside <li> to <b>
    # so <li><a>...</a></li> turns into <li><b>...</b></li>
    tag.find("a").replace_with(newtag)

    # return prettified HTML
    return soup.prettify()
    
# try it
print(get_menu_html("products"))

您将获得:

<ul>
 <li id="menu_home">
  <a href="/">
   Home
  </a>
 </li>
 <li id="menu_products">
  <b>
   Products
  </b>
 </li>
 <li id="menu_about">
  <a href="/about.html">
   About
  </a>
 </li>
</ul>