python - 如何使用 Beautifulsoup4 抓取属性中未指定类或 id 的 HTML 元素

标签 python web-scraping beautifulsoup

我想从页面中抓取单独的内容描述,我可以使用属性中指定的classid来实现。但是..如果 html tag 中未指定 classid 属性,我不知道如何获取该元素。

喜欢这个截图:

enter image description here

<div class="cat_box_desc">
    <h3>Status:</h3>
    on-going <br>
    <h3>Genres:</h3>

    <br>
    <h3>Description:</h3>
    <div align="justify">
        <p> Information</p>
        <p>Type: TV</p>
        <p>Episodes: Unknown</p>
        <p>Status: Currently Airing</p>
        <p>Aired: Oct 7, 2013 to ?</p>
        <p>Producers: Sunrise, TV Tokyo, Sotsu Agency</p>
        <p>Genres: Mecha</p>
        <p>Duration: 25 min. per episode</p>
        <p>Synopsis:</p>
        <p>Gundam Build Fighter adalah sebuah pertarungan simulasi Gundam. Unit Gundam dirangkai dari model plastiknya. Tokoh utamanya adalah seorang anak laki-laki yang bernama Iori Sei. Sei memiliki kemampuan merangkai Gundam yang hebat, namun dia tak
            memiliki kemampuan untuk mengendalikan gundam yang ia rangkai saat melakukan Gunpla Battle. Namun satu hari dia bertemu dengan seorang pencuri roti misterius, yang memberinya sebuah batu permata.</p>
    </div><br>
    <div style="padding-left: 560px; padding-bottom:20px;" class="spacebook">
        <div class="fb-like" data-href="http://animeindo.video/category/gundam-build-fighter/" data-width="450" data-layout="box_count" data-show-faces="false" data-send="false"></div>
    </div>
</div>

我可以抓取 class="cat_box_desc" 内的数据,但是我会得到里面所有的数据,我不想要它,我想把数据分开。

我不知道如何将数据分开,如上面的屏幕截图,其中有状态流派描述信息H1P标签中的strong>等,因为上面没有指定classid

那么如何在 Beautifulsoup4 中做到这一点......?

最佳答案

您已经做出了使用 BeautifulSoup 的非常好的选择,因为它是一个非常灵活的库,具有多种定位元素的方法。

对于 : 分隔的字段,我会将它们解析为字典以便于访问:

import re

from bs4 import BeautifulSoup

data = """
<div class="cat_box_desc">
    <h3>Status:</h3>
    on-going <br>
    <h3>Genres:</h3>

    <br>
    <h3>Description:</h3>
    <div align="justify">
        <p> Information</p>
        <p>Type: TV</p>
        <p>Episodes: Unknown</p>
        <p>Status: Currently Airing</p>
        <p>Aired: Oct 7, 2013 to ?</p>
        <p>Producers: Sunrise, TV Tokyo, Sotsu Agency</p>
        <p>Genres: Mecha</p>
        <p>Duration: 25 min. per episode</p>
        <p>Synopsis:</p>
        <p>Gundam Build Fighter adalah sebuah pertarungan simulasi Gundam. Unit Gundam dirangkai dari model plastiknya. Tokoh utamanya adalah seorang anak laki-laki yang bernama Iori Sei. Sei memiliki kemampuan merangkai Gundam yang hebat, namun dia tak
            memiliki kemampuan untuk mengendalikan gundam yang ia rangkai saat melakukan Gunpla Battle. Namun satu hari dia bertemu dengan seorang pencuri roti misterius, yang memberinya sebuah batu permata.</p>
    </div><br>
    <div style="padding-left: 560px; padding-bottom:20px;" class="spacebook">
        <div class="fb-like" data-href="http://animeindo.video/category/gundam-build-fighter/" data-width="450" data-layout="box_count" data-show-faces="false" data-send="false"></div>
    </div>
</div>"""

soup = BeautifulSoup(data, "html.parser")

# first locate the container with the desired fields
description = soup.find("h3", text="Description:").find_next_sibling()

# get all the ":"-separated fields into a dictionary 
pattern = re.compile(r"\w+:\s.*?")

data = dict(field.split(":") for field in description.find_all(text=pattern))

print(data)

打印:

{'Type': ' TV', 'Episodes': ' Unknown', 'Status': ' Currently Airing', 'Aired': ' Oct 7, 2013 to ?', 'Producers': ' Sunrise, TV Tokyo, Sotsu Agency', 'Genres': ' Mecha', 'Duration': ' 25 min. per episode'}

现在这不会捕获 Synopsis 因为它的值位于单独的 p 元素中,但您可以通过以下方式获取它:

data["Synopsis"] = description.find("p", text="Synopsis:").find_next_sibling("p").get_text()

完整的美化输出:

{'Aired': ' Oct 7, 2013 to ?',
 'Duration': ' 25 min. per episode',
 'Episodes': ' Unknown',
 'Genres': ' Mecha',
 'Producers': ' Sunrise, TV Tokyo, Sotsu Agency',
 'Status': ' Currently Airing',
 'Synopsis': 'Gundam Build Fighter adalah sebuah pertarungan simulasi Gundam. '
             'Unit Gundam dirangkai dari model plastiknya. Tokoh utamanya '
             'adalah seorang anak laki-laki yang bernama Iori Sei. Sei '
             'memiliki kemampuan merangkai Gundam yang hebat, namun dia tak\n'
             '            memiliki kemampuan untuk mengendalikan gundam yang '
             'ia rangkai saat melakukan Gunpla Battle. Namun satu hari dia '
             'bertemu dengan seorang pencuri roti misterius, yang memberinya '
             'sebuah batu permata.',
 'Type': ' TV'}

我们在这里使用了一些技术,下面是库文档相应部分的文档链接。请务必查阅以更好地了解这些功能:

关于python - 如何使用 Beautifulsoup4 抓取属性中未指定类或 id 的 HTML 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53827240/

相关文章:

javascript - innerText和变量不起作用的比较

python - numpy 的磁盘阵列很大

python - 更改Python中Hexbin图中的x和y输入范围

javascript - 让 NodeJS/JSDom 在抓取之前等待完全渲染

python - BeautifulSoup 迭代多个 XML 标签,提取字符串列表

python - 使用 html 进入 url 并抓取表格

python - 找到标签内容后出现问题,无法求和

python - pyodbc for 循环和 commit()

python - 如何进行这个 pandas 查询?

python - 查找包含文章的子页面 URL 并从中收集数据