V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
omg21
V2EX  ›  Python

如何解决 html 代码中“<a><b></a></b>”这样的错误

  •  
  •   omg21 · 2016-10-23 19:28:56 +08:00 · 2544 次点击
    这是一个创建于 2741 天前的主题,其中的信息可能已经有所发展或是发生改变。
    浏览器对 html 代码的容错性很强,像下面这句,两个标签开始结束的位置差开了,应该是个包含结构, a 包含 b ,结果错成了交叉结构。
    但是这样浏览器也能正常解析。

    <a target="_blank" href="http://wenda.eask.org/"><b>我要提问</a></b>

    可是 BS4 在处理这样的页面时就中枪了,其实还有其他一些错误,比如,一个页面有好几个“<body>”标签,这个处理时比较简单,只保留第一个“<body>”,把后边的全删除即可。但这种交叉的我现在还想不出如何来处理。

    附上句中的地址 http://www.eask.org/beijing/
    12 条回复    2016-10-24 11:02:08 +08:00
    menc
        1
    menc  
       2016-10-23 20:30:32 +08:00
    使用容错性高的 html parser ,但是这个问题我记得 bs4 是可以解决的
    MinonHeart
        2
    MinonHeart  
       2016-10-23 20:56:12 +08:00
    把标签写正确🙃
    binux
        3
    binux  
       2016-10-23 21:00:52 +08:00
    lxml.html, html5parser
    omg21
        4
    omg21  
    OP
       2016-10-23 21:06:35 +08:00
    @menc 我用的就是 html parser
    menc
        5
    menc  
       2016-10-23 22:02:52 +08:00
    @omg21 。。。。 html parser 是 general 的概念,不是某一个库或者东西。你应该尝试其他的 html parser


    @binux lxml 是不行的, lxml 对 html 符合标准要求很严格
    mhycy
        6
    mhycy  
       2016-10-23 22:07:09 +08:00
    碰上这种页面直接上正则表达式解决
    binux
        7
    binux  
       2016-10-23 22:23:29 +08:00
    @menc
    In [1]: import lxml.html

    In [2]: dom = lxml.html.fromstring(u'<a target="_blank" href="http://wenda.eask.org/"><b>我要提问</a></b>')

    In [3]: print lxml.html.tostring(dom, encoding="unicode")
    <a target="_blank" href="http://wenda.eask.org/"><b>我要提问</b></a>
    omg21
        8
    omg21  
    OP
       2016-10-23 23:22:51 +08:00
    @binux pypi 现在上不去了,暂时没法试。如果是全文而不是这一句,能改过来吗?
    omg21
        9
    omg21  
    OP
       2016-10-23 23:24:26 +08:00
    @mhycy 不行啊,我做的是通用处理,像这种类型的没法判断错误原因,更没法用正则处理。
    menc
        10
    menc  
       2016-10-23 23:43:46 +08:00
    @binux 那就行:)
    firemiles
        11
    firemiles  
       2016-10-24 00:09:25 +08:00 via Android
    只识别标签头,任意结束标签当当前起始标签的结束,这么干就随意交叉,只要头的顺序对就行
    jaimezhan
        12
    jaimezhan  
       2016-10-24 11:02:08 +08:00
    写代码不严谨 或者使用编辑器的插件 自动补充关闭标签减少类似的错误代码
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5252 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 09:31 · PVG 17:31 · LAX 02:31 · JFK 05:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.