【Python】bs4で指定要素とその値と、直後の要素とその値をpandasデータフレームにする。スクレイピングの備忘録【BeautifulSoup4】

スクレイピングのプログラム的備忘録

from bs4 import BeautifulSoup
import pandas as pd

HTMLのサンプル

html = """

h1要素です

h1直下のh2要素です

3000/11/11
スクレイピング

Pタグの1行目

一枚目の画像

なんとかかんとかここに書いてある

h2:ぽんぽこどう本舗はかわいいたぬきが運営するお店だよ

h1要素の2番めです。変則的にh2の下に入れておきます

いや、きつねが化けているんや

えー、そうなの?

"""

内容は気にしないでください。
疲れの極致にて。

リスト内包表記にif文でh1に続く要素がPだったら、タグのテキストだけをリストに追加する。

soup = BeautifulSoup(html, features="lxml")
lists = []

lists

select

all_h1 = soup.select('h1')
[

h1要素です

h1要素の2番めです。変則的にh2の下に入れておきます

]

指定タグ以降の要素を取得

soup.h2.next_elements

イテレータが云々カンヌンにて以下。

for x in soup.h2.next_elements:
 print('*'*10)
 print(x)
**********
h1直下のh2要素です
**********

**********

**********
3000/11/11

**********
スクレイピング
**********
スクレイピング
**********
スクレイピング
**********

**********

**********

Pタグの1行目

一枚目の画像

なんとかかんとかここに書いてある

h2:ぽんぽこどう本舗はかわいいたぬきが運営するお店だよ

h1要素の2番めです。変則的にh2の下に入れておきます

いや、きつねが化けているんや

えー、そうなの?

********** **********

Pタグの1行目

********** Pタグの1行目 ********** ********** 一枚目の画像 ********** **********

なんとかかんとかここに書いてある

********** **********

なんとかかんとかここに書いてある

********** なんとかかんとかここに書いてある ********** ********** **********

h2:ぽんぽこどう本舗はかわいいたぬきが運営するお店だよ

********** h2:ぽんぽこどう本舗はかわいいたぬきが運営するお店だよ ********** **********

h1要素の2番めです。変則的にh2の下に入れておきます

********** h1要素の2番めです。変則的にh2の下に入れておきます ********** **********

いや、きつねが化けているんや

********** いや、きつねが化けているんや ********** **********

えー、そうなの?

********** えー、そうなの? ********** **********

リスト内包表記とif


Pタグの1行目
なんとかかんとかここに書いてある
いや、きつねが化けているんや
えー、そうなの?

要素のあるなし判定(属性)

if soup.div.has_attr('class'):

else:
    print('pass')

Class化

(素人ながら)最終的にどうまとめたかというのがこちらです。

class Tag_Search:

    def __init__(self):
        lists = ['test']

    def tags_siblings(self):

        self.lists = []

        soup = self.soup
        tags = soup.find_all(self.tag_target)

        if tags is None:
            pass
        else:
            #print(tags)
            for tag in tags:

                #print(tag.name,tag.text)

                tag_sib = tag.next_siblings

                #print(tag_sib,':sib')

                for sibling in tag_sib:
                    #print(type(sibling))
                    if sibling.name == 'p':
                        self.lists.append()
                        #print(sibling.name,sibling.text)
        return self.lists

要素のあるなし判定をifでやっておいて、next_siblingsでターゲット要素の直後の要素と値も取得します。

TS = Tag_Search()
TS.soup = BeautifulSoup(html, features="lxml")

for tag in ['h1','h2']:
    TS.tag_target = tag
    TS.tags_siblings()
pd.DataFrame(TS.lists,columns=['h','content'])
p いや、きつねが化けているんや
p えー、そうなの?
p いや、きつねが化けているんや
p えー、そうなの?
h   content
0   h2:ぽんぽこどう本舗はかわいいたぬきが運営するお店だよ    いや、きつねが化けているんや
1   h2:ぽんぽこどう本舗はかわいいたぬきが運営するお店だよ    えー、そうなの?