在Python中使用BeautifulSoup,如何将数据分隔到下一个<h3>标签?

时间:2017-09-26 10:22:58

标签: python html beautifulsoup scrape

问题有点令人困惑,但我希望下面的例子可以澄清事情。

我尝试从页面中的一个(且仅)<div>标记中抓取数据。

问题1:该div中的所有数据全部放在一起,仅由<h3>标记分隔。

问题2:<p>代码后<h3>代码变数可变,h3代码可以是Title1或Title2。

如何解析div元素并将所有数据拆分为某种类型的数组/字典结构,该结构仅包含h3个标记和所有p标记,直到下一个h3标记

Problem explanation

图片说明了一切。

到目前为止我的代码(可以处理和删除数据):

links = soup.find('div', class_='DIV I WANT')

for p in links.find_all(['p', 'h3']):
print p.text.strip()

编辑:

添加了完整的HTML。是的,它写得完全一样。数据显然略有变化:

<div class="table">


    <p>
            List of actors.
    </p>


    <p>
            date 25.09.2017
    </p>



    <h3>
            Actor
    </h3>
    <p>
        Office
        <br>
        Address 1 8, 100 City 15
        <br>
        Address 2 250, 200 City 15
    </p>

        <p>
                08h00-12h30  13h15-16h45&lt;br&gt;08h00-12h30  13h00-15h00  
        </p>


        <p>
            <a href="http://www.example.com" target="_blank" title="Actors" class="fonticon">www.example.com<span data-icon="l"></span></a>
        </p>


        <p>

                info@example.com
                <br>

        </p>


        <p>

                012/123 45 67
                <br>

        </p>


        <p>
                telefax 123/123 45 67
        </p>


    <h3>
            Actress
    </h3>
    <p>
        Personal address
        <br>
        Address 7, 20 City 2
        <br>
        Address 5, 30 City 2
    </p>

        <p>
                8h15-12h30 13h30-16h30(lu-ma-je)16h45 me&lt;br&gt;8h15-12h30
        </p>


        <p>
            <a href="http://www.example.com" target="_blank" title="Actress" class="fonticon">www.example.com<span data-icon="l"></span></a>
        </p>


        <p>

                info@example.com
                <br>

        </p>


        <p>

                023/999 99 99
                <br>

                023/999 99 88 phone1
                <br>

                023/999 99 77 phone2
                <br>

        </p>


        <p>
                telefax 001/333 44 55&lt;br&gt;telefax 001/000 00 10 ppts
        </p>


    <h3>
            Actor
    </h3>

1 个答案:

答案 0 :(得分:1)

使用select选择所有h3标记,然后.next_siblings进行迭代并添加每个元素的文本,直到找到下一个h3标记

data = []
titles = soup.select('.table h3') 
for title in titles:
  if('Title1' or 'Title2' in title:
    item = {"title":title.get_text(),"description":""}

    for sibling in title.next_siblings:
      #stop when you reach the next tag
      if(sibling.name == "h3"):
        break;

      try:
        item['description']  += sibling.get_text()
      except:
        pass
    data.append(item)
print(data)