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
wencan
V2EX  ›  Python

请教 lxml 分析 html 的问题

  •  
  •   wencan · 2017-08-10 10:47:24 +08:00 · 2058 次点击
    这是一个创建于 2695 天前的主题,其中的信息可能已经有所发展或是发生改变。

    写一个爬虫程序,使用 lxml.html 分析网页
    遇到一个正文带图片的网页,无法正常解析

    不带图片的正文部分是这样的:

    <font face="宋体" size="3"><!--HTMLBUILERPART0--><DIV style="FLOAT: left"><script type="text/javascript" src="/2014newad.js"></script><br><script type="text/javascript" src="/xyoushangjiaoguanggao.js"></script><br><script type="text/javascript" src="/3youshangjiaoguanggao.js"></script></DIV>  我是文本<BR><BR> 
      我是文本<BR><BR> 
      我是文本<BR><BR> 
    <!--/HTMLBUILERPART0--><br><div align="center"></div> </font>
    

    带图片的正文部分是这样的:

    <font face="宋体" size="3"><!--HTMLBUILERPART0--><DIV style="FLOAT: left"><script type="text/javascript" src="/2014newad.js"></script><br><script type="text/javascript" src="/xyoushangjiaoguanggao.js"></script><br><script type="text/javascript" src="/3youshangjiaoguanggao.js"></script></DIV>
    <center><img border="0" src="zz.jpg" width="126" height="144"></center><BR><BR>
      我是文本<BR><BR> 
      我是文本<BR><BR> 
    <!--/HTMLBUILERPART0--><br><div align="center"></div> </font>
    

    中间多出了:

    <center><img border="0" src="zz.jpg" width="126" height="144"></center>
    

    解析代码为:

            body = doc.xpath("/html/body")[0]
            lines = body.xpath("//font[@face=\"宋体\" and @size=\"3\"]/*")
    
            context = []
            for line in lines:
                if not line.tail:
                    continue
                context.append(line.tail)
    
            return context
    

    代码解析不带图片的正文正常
    解析带图片的正文,无法得到图片和文本节点(跟 if not line.tail 无关)

    2 条回复    2017-08-10 19:34:30 +08:00
    keakon
        1
    keakon  
       2017-08-10 18:50:58 +08:00   ❤️ 1
    因为这是个错误的 html,font 是 inline 元素,center 是 block 元素,lxml 在构造时会把 center 移到 font 外部。
    zhusimaji
        2
    zhusimaji  
       2017-08-10 19:34:30 +08:00 via iPhone
    爬虫就用 bs4 解析,方便快捷
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3789 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 00:14 · PVG 08:14 · LAX 16:14 · JFK 19:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.