关于beautifulsoup的一个bug 由于<!–[if lte IE 6]><![endif]–>无法正常解析标签)

问题:我想爬个一个新浪旅游博客博主的文章(以前看过nodejs爬的,感觉文章好,而且页面布局比较适合练习爬虫)


然后准备解析标签的时候,发现find或者find_all找不到对应标签。甚至写成find('a'),find('p')都找不到标签  并且能find('head')却不能find('body')

然后我用

print soup.prettify()
找了一下 输出信息
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
 <head>
  <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
  <title>
   博文_柳絮同学_新浪博客
  </title>
  <meta content="IE=EmulateIE8,chrome=1" http-equiv="X-UA-Compatible"/>
  <meta content="webkit" name="renderer"/>
  <meta content="博文...." name="keywords">
   <meta content="博文..." name="description"/>
   <!--–[if lte IE 6]-->
   <script type="text/javascript">
    try{
document.execCommand("BackgroundImageCache", false, true);
}catch(e){}
   </script>
  </meta>
 </head>
</html>

确实是只能find(‘head') 标签 ,但是head里面的东西比如style标签就爬不了

我尝试把页面内容放在文件里,删掉了head所有内容,发现可以正常用soup解析页面了

是head导致的吗,但是查阅网上并没有说什么body无法正常用bs匹配的信息

果然,我只留一个<head></head>空head标签,仍然可以正常解析

那么,肯定是head里面的内容所导致的。

通过排除删查

<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>博文_柳絮同学_新浪博客</title>
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8,chrome=1" />
<meta name="renderer" content="webkit">
<meta name="keywords" content="..." />
<meta name="description" content="..." />
<!–[if lte IE 6]>
<script type="text/javascript">
try{
document.execCommand("BackgroundImageCache", false, true);
}catch(e){}
</script>
<![endif]–>
<script type="text/javascript">
window.staticTime=new Date().getTime();
</script>
<link rel="pingback" href="http://upload.move.blog.sina.com.cn/blog_rebuild/blog/xmlrpc.php" />
<link rel="EditURI" type="application/rsd+xml" title="RSD" href="http://upload.move.blog.sina.com.cn/blog_rebuild/blog/xmlrpc.php?rsd" />
<link href="http://blog.sina.com.cn/blog_rebuild/blog/wlwmanifest.xml" type="application/wlwmanifest+xml" rel="wlwmanifest" />
<link rel="alternate" type="application/rss+xml" href="http://blog.sina.com.cn/rss/1776757314.xml" title="RSS" />
<link href="http://simg.sinajs.cn/blog7style/css/conf/blog/articlelist.css" type="text/css" rel="stylesheet" /><style id="tplstyle" type="text/css">@charset "utf-8";@import url("http://simg.sinajs.cn/blog7newtpl/css/4/4_2/t.css");
</style>
<style id="positionstyle"  type="text/css">
.sinabloghead .blogtoparea{ left:135px;top:58px;}
.sinabloghead .blognav{ left:150px;top:60%;}
</style>
<style id="bgtyle"  type="text/css">
</style>
<style id="headtyle"  type="text/css">
</style>
<style id="navtyle"  type="text/css">
</style>
</head>
在第一个script标签外层 有个 <![if lte IE 6><![endif]->所导致的 ,这是一个鉴别浏览器的前端页面写法

在网上查询,beautifulsoup 3.0.6以下无法解析,包含这段以及类似的鉴别代码,都会是bs解析产生bug。

需要通过正则消除即可。

https://stackoverflow.com/questions/132488/regex-to-remove-conditional-comments

给出的几个正则匹配,或是自己写一个。


"<!--\[if\s(?:[^<]+|<(?!!\[endif\]-->))*<!\[endif\]-->"
"?s:<!--\[if\s.*?<!\[endif\]-->"
 "<!--\[if IE\]>.*?<!\[endif\]-->"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值