返回顶部
首页 > 资讯 > 后端开发 > Python >_markupbase.py if no
  • 503
分享到

_markupbase.py if no

_markupbasepy 2023-01-30 23:01:18 503人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

BUG触发时的完整报错内容(本地无关路径用已经用 **** 隐去): **************\lib\site-packages\bs4\builder\_htmlparser.py:78: UserWarning: unknown

BUG触发时的完整报错内容(本地无关路径用已经用 **** 隐去):

**************\lib\site-packages\bs4\builder\_htmlparser.py:78: UserWarning: unknown status keyWord 'end ' in marked section
  warnings.warn(msg)
Traceback (most recent call last):
  File "**************/test.py", line 5, in <module>
    bs = BeautifulSoup(html, 'html.parser')
  File "**************\lib\site-packages\bs4\__init__.py", line 281, in __init__
    self._feed()
  File "**************\lib\site-packages\bs4\__init__.py", line 342, in _feed
    self.builder.feed(self.markup)
  File "**************\lib\site-packages\bs4\builder\_htmlparser.py", line 247, in feed
    parser.feed(markup)
  File "D:\Program Files\python37\lib\html\parser.py", line 111, in feed
    self.Goahead(0)
  File "D:\Program Files\python37\lib\html\parser.py", line 179, in goahead
    k = self.parse_html_declaration(i)
  File "D:\Program Files\Python37\lib\html\parser.py", line 264, in parse_html_declaration
    return self.parse_marked_section(i)
  File "D:\Program Files\Python37\lib\_markupbase.py", line 160, in parse_marked_section
    if not match:
UnboundLocalError: local variable 'match' referenced before assignment

在解析HTML时,标签开始部分使用形如 <!-[if IE eq 9]> 的浏览器判断标识符,结束时结束标签<![end if]->(正确的开始和结束标签应该为<!--[if IE 9]><![endif]-->)无法正常匹配关闭即可触发。
触发BUG的示例代码如下:

from bs4 import BeautifulSoup

html = """
<!-[if IE eq 9]>
    <a href="https://www.shwww.net/">Https://www.shwww.net/</a>
<![end if]->
"""

bs = BeautifulSoup(html, 'html.parser')

在 Python 3.7.0 版本中,触发BUG部分的代码存在于 \Lib\_markupbase.py 中的 146 行的 parse_marked_section 方法,该方法代码如下:
https://GitHub.com/python/cpython/blob/bb9ddee3D4e293f0717f8c167afdf5749ebf843d/Lib/_markupbase.py#L160

    def parse_marked_section(self, i, report=1):
        rawdata= self.rawdata
        assert rawdata[i:i+3] == '<![', "unexpected call to parse_marked_section()"
        sectName, j = self._scan_name( i+3, i )
        if j < 0:
            return j
        if sectName in {"temp", "cdata", "ignore", "include", "rcdata"}:
            # look for standard ]]> ending
            match= _markedsectionclose.search(rawdata, i+3)
        elif sectName in {"if", "else", "endif"}:
            # look for MS Office ]> ending
            match= _msmarkedsectionclose.search(rawdata, i+3)
        else:
            self.error('unknown status keyword %r in marked section' % rawdata[i+3:j])
        if not match:
            return -1
        if report:
            j = match.start(0)
            self.unknown_decl(rawdata[i+3: j])
        return match.end(0)

由于错误的HTML代码未正确关闭,使得流程判断既没有进入 if sectName in {"temp", "cdata", "ignore", "include", "rcdata"}:
elif sectName in {"if", "else", "endif"}: ,而是报出一个错误 UserWarning: unknown status keyword 'end ' in marked section warnings.warn(msg) 后执行到 if not match ,而此时 match 未申明,故而触发错误。

此BUG存在于多个Python版本中,修复方法,在 if sectName in {"temp", "cdata", "ignore", "include", "rcdata"}: 之前预定义一个match变量即可:
https://github.com/python/cpython/blob/bb9ddee3d4e293f0717f8c167afdf5749ebf843d/Lib/_markupbase.py#L152

    def parse_marked_section(self, i, report=1):
        rawdata= self.rawdata
        assert rawdata[i:i+3] == '<![', "unexpected call to parse_marked_section()"
        sectName, j = self._scan_name( i+3, i )
        if j < 0:
            return j
        match = None
        if sectName in {"temp", "cdata", "ignore", "include", "rcdata"}:
            # look for standard ]]> ending
            match= _markedsectionclose.search(rawdata, i+3)
        elif sectName in {"if", "else", "endif"}:
            # look for MS Office ]> ending
            match= _msmarkedsectionclose.search(rawdata, i+3)
        else:
            self.error('unknown status keyword %r in marked section' % rawdata[i+3:j])
        if not match:
            return -1
        if report:
            j = match.start(0)
            self.unknown_decl(rawdata[i+3: j])
        return match.end(0)

--结束END--

本文标题: _markupbase.py if no

本文链接: https://lsjlt.com/news/181198.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • _markupbase.py if no
    BUG触发时的完整报错内容(本地无关路径用已经用 **** 隐去): **************\lib\site-packages\bs4\builder\_htmlparser.py:78: UserWarning: unknown...
    99+
    2023-01-30
    _markupbase py
  • (C和指针) #if 0/#if 1...#end if
    一. “#if   0/  #if 1  ...  #endif” 的作用 1) code中定义的是一些调试版本的代码,此时code...
    99+
    2022-11-15
    指针 if
  • python中if的基础用法(if else和if not)
    目录前言1.if … else …2. if … elif … else…3.if not …4....
    99+
    2024-04-02
  • PasswordAuthentication no
    1. 安装图形界面 在云服务器上安装图形界面需要先安装 X Window 系统和桌面环境。以 Ubuntu 为例,可以通过以下命令安装: sudo apt-get update sudo apt-get install ubuntu-d...
    99+
    2023-10-27
    PasswordAuthentication
  • 【自学Java】Java if else-if else语句
    Java else if Java else if教程 在 Java 语言 中,关键字 if 是用于测试某个条件(布尔型 或逻辑型)的语句是否满足一定的条件,如果满足特定的条件,则会执行 if 后由大...
    99+
    2023-09-17
    java 开发语言
  • mysql sum(if())和count(if())如何使用
    这篇“mysql sum(if())和count(if())如何使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“...
    99+
    2023-06-26
  • if语句
    [TOC] 语法 if语句 示例 #!/usr/bin/env python user = 'jack' passwd = 'jack' username = input('username:') password = input('p...
    99+
    2023-01-31
    语句
  • python3 if __name__
    想必很多初次接触python的同学都会见到这样一个语句,if __name__ == "__main__":那么这个语句到底是做什么用的呢?在解释之前,首先要声明的是,不管你是多么小白,你一定要知道的是:1.python文件的后缀为.py;...
    99+
    2023-01-31
  • python 之 if
    #python if 用法 a = input("how old are you: ") if a > 100:     print "你死了" elif a > 60:     print "你老了" elif a>18...
    99+
    2023-01-31
    python
  • Vue中v-if、v-if-else、v-else-if与v-show的基本使用
    目录一、Vue的条件渲染1.1.v-if1.2.v-if-else1.3.v-else-if 1.4.template元素 1.5.v-show1.6.v...
    99+
    2022-11-13
    vue v-if v-show else if的用法 vue v-if else
  • mysql sum(if())和count(if())的用法说明
    目录mysql sum(if())和count(if())的用法解析mysql 聚合函数 根据条件求和 sum(if())mysql sum(if())...
    99+
    2024-04-02
  • security NO.3
    思科>enable 进入特权模式#configure terminal 进入全局配置模式给端口配置地址int fa0/0ip add 192.168.1.1 255.255.255.0no shutdownexit...
    99+
    2023-01-31
    security
  • ImportError: No modu
    报错:ImportError: No module named bs4我的Python版本python --versionpython 2.7.5按照网上方法尝试安装BeautifulSoup无果,BeautifulSoup据说能在pyth...
    99+
    2023-01-31
    ImportError modu
  • ImportError: No mod
    报错如下错误:>>> import sqlite3Traceback (most recent call last):  File "<stdin>", line 1, in <module>  F...
    99+
    2023-01-31
    ImportError mod
  • vue中v-if、v-else-if、v-else怎么用
    这篇文章主要为大家展示了“vue中v-if、v-else-if、v-else怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“vue中v-if、v-else-...
    99+
    2024-04-02
  • shell if -z -f
    if判断中常使用的shell选项 选项    含义 -eq    //等于 -ne    //不等于 -gt    //大于 -lt    //小于 -ge    //大于等于 -le    //小于等于 -z    判断变量是否存在值  ...
    99+
    2023-09-11
    java servlet 服务器
  • [Mysql] IF函数
    IF函数根据判断条件是否成立进行选择执行,成立时执行一条语句,不成立时执行另一条语句 语法结构 IF(condition, value_if_true, value_if_false) 参数说明 condition: 判断条件 ...
    99+
    2023-09-01
    mysql sql
  • python if-elif-else
    输入变量 age 的值,再编写一个 if-elif-else 结构,根据 age的值判断处于人生的哪个阶段。如果一个人的年龄小于 2岁,就打印一条消息,指出他是婴儿。如果一个人的年龄为 2(含)~4岁,就打印一条消息,指出他正蹒跚学步。如...
    99+
    2023-01-30
    python elif
  • python- if 判断
    我们人有判断的功能,计算机既然模仿人,那就也一定有判断的功能。 Python中的判断使用 “if” 判断语法 if判断是干什么的呢?if判断其实是在模拟人做判断。就是说如果这样干什么,如果那样干什么 if 条件: 代码块 代码1 代...
    99+
    2023-01-31
    python
  • python 多重if
    if [条件1]: [命令1] elif [条件2]: [命令2] .... elif [条件n]: [命令n] ...
    99+
    2023-01-31
    python
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作