Bsoup4提取未被父元素包装的子元素

时间:2015-07-31 17:41:35

标签: python html web-scraping beautifulsoup

上下文

本文假设以下背景:

  • python 2.7
  • bsoup4
  • 使用非包装(相邻)元素抓取内容

问题

目标

  • Trevor希望提取相关内容未被统一元素包装的页面内容,而是与标题元素相邻。
  • 在下面的示例中,Trevor想要一个包含四个元素的python数据结构,每个元素包含一个“标题”名称 - 值对和一个“正文”名称 - 值对。

详细信息

解释的最佳方式是举例:

<h2>Alpha blurb</h2>

* content here one
* content here two

<h2>Bravo blurb</h2>

* content here one
* content here two
* content here tree
* content here four
* content here fyve
* content here seeks

<h2>Charlie blurb</h2>

* content here four
* content here fyve
* content here seeks

<h2>Delta blurb</h2>

* blah

从Trevor到目前为止看到的,Bsoup使用一种策略来抓取内容,包括查找容器元素并迭代它们并钻入它们。

但是,在这种情况下,Trevor希望提取每个Header项及其相关内容,即使相关内容未包含在包含元素中。

一个内容部分的开始位置和另一个内容部分的唯一指示是标题标记的放置。

问题

bsoup4的文档可以在哪里搜索,或者Trevor可以查找哪些术语来封装这个原则并获得他想要做的结果?

1 个答案:

答案 0 :(得分:1)

Trevor需要侧身并使用.next_siblings。例如:

from bs4 import BeautifulSoup


page = """
<div>
<h2>Alpha blurb</h2>

* content here one
* content here two

<h2>Bravo blurb</h2>

* content here one
* content here two
* content here tree
* content here four
* content here fyve
* content here seeks

<h2>Charlie blurb</h2>

* content here four
* content here fyve
* content here seeks

<h2>Delta blurb</h2>

* blah
</div>
"""
soup = BeautifulSoup(page)

for h2 in soup.find_all("h2"):

    print h2.text

    # loop over siblings until h2 is met (or no more siblings left)
    for item in h2.next_siblings:
        if item.name == "h2":
            break

        print item.strip()

    print "----"

打印:

Alpha blurb
* content here one
* content here two
----
Bravo blurb
* content here one
* content here two
* content here tree
* content here four
* content here fyve
* content here seeks
----
Charlie blurb
* content here four
* content here fyve
* content here seeks
----
Delta blurb
* blah
----