Как я могу захватить CData из BeautifulSoup

У меня есть веб-сайт, который я очищаю, который имеет подобную структуру следующее. Я хотел бы смочь захватить информацию из блока CData.

Я использую BeautifulSoup для получения по запросу другой информации от страницы, поэтому если бы решение может работать, с которым, это помогло бы подавить мою кривую обучения, поскольку я - новичок Python. А именно, я хочу достигнуть два различных типов данных, скрытых в операторе CData. первое, которое является просто текстом, я вполне уверен, я могу бросить regex в него и получить то, в чем я нуждаюсь. Для второго типа, если я мог бы отбросить данные, которые имеют элементы HTML в свой собственный beautifulsoup, я могу проанализировать это.

Я просто изучаю Python и beautifulsoup, таким образом, я изо всех сил пытаюсь найти волшебное колдовство, которое даст мне просто CData отдельно.

<!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>
6
задан plaes 13 May 2013 в 08:24
поделиться

2 ответа

[

] BeautifulSoup рассматривает CD-данные как особый случай (подкласс) "навигационных строк". Так, например:[

] [
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
] [

]В вашем случае вы, конечно, могли бы смотреть в поддереве, начинающемся с div с идентификатором "main content", а не по всему дереву документов.[

].
12
ответ дан 8 December 2019 в 13:00
поделиться
[

]Можно попробовать так:[

] [
from BeautifulSoup import BeautifulSoup

// source.html contains your html above
f = open('source.html')
soup = BeautifulSoup(''.join(f.readlines()))
s = soup.findAll('script')
cdata = s[0].contents[0]
] [

]Это должно дать вам содержимое кданных.[

] [

][]Обновление[][

] [

]Это может быть немного чище:[

] [
from BeautifulSoup import BeautifulSoup
import re

// source.html contains your html above
f = open('source.html')
soup = BeautifulSoup(''.join(f.readlines()))
cdata = soup.find(text=re.compile("CDATA"))
] [

]Просто личные предпочтения, но мне больше нравится нижнее.[

]
3
ответ дан 8 December 2019 в 13:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: