Цикл по блокам таблиц XML с BeautifulSoup в Python - PullRequest
0 голосов
/ 04 мая 2018

У меня есть структура данных при синтаксическом анализе XML с красивым супом:

<h2>Fri 4 May</h2><table cellspacing="0" cellpadding="12">

            <tr>

                <td class="time ">6:00am</td>  

                <td class="other-details ">

                    <a class="prog-link" href="http://www.tvguide.co.uk/m-detail/157702075/137913159/breakfast" id="308829348" >

                        <div class="title" style="border-left:4px solid #CE3D32">

                            Breakfast

                        </div>

                        <div class="detail">

                        A round-up of national and international news, plus current affairs, arts and entertainment, and weather   

                            <div class="other">

                            (Subtitles) (Interactive) 

                            </div>

                            <br>





                                    <div class="rating">Rating:  <span class="rating-num">1.5</span></div>



                        </div>

                    </a>

                </td>

            </tr>
...
...
...
</table>

Существует несколько таких структур в хронологическом порядке, в которых имеются данные телегида для последовательных дней.

Код, который я имею в данный момент, выглядит так:

for x in soup.select('h2'):

                for tr in soup.select('table tr'):

                    if not tr.script:

                        for td in tr.find_all('td'):

                            a = ''.join(re.sub(r'\s+', ' ', td.text))
                            b = a.strip()

                            #print x.text
                            #print b

                            if b[:1] in '0123456789':


                                date_list.append(b)


                            else:

                                if ' Rating' in b:

                                    c = b.split(' Rating')

                                else:

                                    c = b.split(' Rating')
                                    c.append(0.0)

                                desc = c[0]
                                desc_list.append(desc)


                                rating = ''.join(['Rating: ', str(c[1])])
                                rating_list.append(rating)

Однако, это дает мне каждый блок во всех возможных датах для КАЖДОГО экземпляра даты, как определено в теге <h2>. Что я действительно хочу в логическом порядке:

  1. Интегрируйте через каждый <h2> тег даты в порядке.
  2. Печатать только блок <table>, принадлежащий этому дню.

Я почти у цели, просто не могу понять, какую последнюю поправку мне нужно внести.

1 Ответ

0 голосов
/ 04 мая 2018

Я полагаю, что проблема может заключаться в том, что «soup.select» всегда начинается с начала вашего XML, и, таким образом, в вашем втором супе .select вы найдете все экземпляры tr.

В этом следующем фрагменте я заменил второй soup.select на x.select - тогда выбор будет выполняться только с узла «x», а не с начала.

for x in soup.select('table'):

                for tr in x.select('tr'):
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...