首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何从BeautifulSoup中获取CData

如何从BeautifulSoup中获取CData
EN

Stack Overflow用户
提问于 2010-01-09 10:53:22
回答 3查看 13.4K关注 0票数 11

我有一个网站,我正在抓取,具有类似的结构如下。我希望能够从CData块中获取信息。

我正在使用BeautifulSoup从页面上提取其他信息,所以如果解决方案可以使用它,它将帮助我降低学习曲线,因为我是python新手。具体地说,我想了解隐藏在CData语句中的两种不同类型的数据。第一个是文本,我非常确定我可以抛出一个正则表达式来得到我需要的东西。对于第二种类型,如果我可以将具有html元素的数据放入它自己的漂亮汤中,我就可以解析它。

我只是在学习python和漂亮的汤,所以我正在努力寻找一个神奇的咒语,它只会给我CData本身。

代码语言:javascript
复制
<!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>  
<title>
   Cows and Sheep
  </title>
</head>
<body>
 <div id="main">
  <div id="main-precontents">
   <div id="main-contents" class="main-contents">
    <script type="text/javascript">
       //<![CDATA[var _ = g_cow;_[7654]={cowname_enus:'cows rule!',leather_quality:99,icon:'cow_level_23'};_[37357]={sheepname_enus:'baa breath',wool_quality:75,icon:'sheep_level_23'};_[39654].cowmeat_enus = '<table><tr><td><b class="q4">cows rule!</b><br></br>
       <!--ts-->
       get it now<table width="100%"><tr><td>NOW</td><th>NOW</th></tr></table><span>244 Cows</span><br></br>67 leather<br></br>68 Brains
       <!--yy-->
       <span class="q0">Cow Bonus: +9 Cow Power</span><br></br>Sheep Power 60 / 60<br></br>Sheep 88<br></br>Cow Level 555</td></tr></table>
       <!--?5695:5:40:45-->
       ';
        //]]>
      </script>
     </div>
     </div>
    </div>
 </body>
</html>
EN

回答 3

Stack Overflow用户

发布于 2010-01-09 11:31:42

BeautifulSoup将CData看作是“可导航字符串”的特例(子类)。举个例子:

代码语言:javascript
复制
import BeautifulSoup

txt = '''<foobar>We have
       <![CDATA[some data here]]>
       and more.
       </foobar>'''

soup = BeautifulSoup.BeautifulSoup(txt)
for cd in soup.findAll(text=True):
  if isinstance(cd, BeautifulSoup.CData):
    print 'CData contents: %r' % cd

当然,在您的例子中,您可以从带有‘main-content’ID的div开始查看子树,而不是遍及整个文档树。

票数 13
EN

Stack Overflow用户

发布于 2014-05-20 16:16:53

代码语言:javascript
复制
import re
from bs4 import BeautifulSoup

soup = BeautifulSoup(content)
for x in soup.find_all('item'):
    print re.sub('[\[CDATA\]]', '', x.string)
票数 0
EN

Stack Overflow用户

发布于 2019-03-15 05:15:18

对于任何使用BeautifulSoup4的人来说,Alex Martelli的解决方案都是有效的,但要这样做:

代码语言:javascript
复制
from bs4 import BeautifulSoup, CData

soup = BeautifulSoup(txt)
for cd in soup.findAll(text=True):
  if isinstance(cd, Cdata):
    print 'CData contents: %r' % cd
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2032172

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档