请教 lxml 分析 html 的问题

2017-08-10 10:47:24 +08:00
 wencan

写一个爬虫程序,使用 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 无关)

2038 次点击
所在节点    Python
2 条回复
keakon
2017-08-10 18:50:58 +08:00
因为这是个错误的 html,font 是 inline 元素,center 是 block 元素,lxml 在构造时会把 center 移到 font 外部。
zhusimaji
2017-08-10 19:34:30 +08:00
爬虫就用 bs4 解析,方便快捷

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/381863

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX