【爬虫笔记】关于Beautiful Soup 4

再使用Beautiful Soup 4时遇到了一些问题,找到了解决方法,通过本博文将遇到的问题和解决方法记录下来,方便回顾也希望能帮助大家解决类似问题。

1. 遇到“Some characters could not be decoded, and were replaced with REPLACEMENT CHARACTER.”警告

遇到这个错误的原因是“文档包含以完全不同的编码编写的文本”,这时候需要待解析文本的指定编码方式,通常可以在网页源码中找到网页的编码方式,就像下图:

 接着,只需要在原来调用beautiful soup的语句中指定编码方式即可:

soup = BeautifulSoup(html, "html.parser",from_encoding="uft-8")

 参考博文:https://www.cnblogs.com/HANYI7399/p/6080070.html

2. 需要获取相同标签的非第一个元素

利用bs4获取标签下的子元素内容时可以利用“本元素.子元素标签”的方式访问,但是这样的访问方式默认是返回对应标签的第一个元素的,这时候可以利用find_all方法达到这个效果。

例子:

HTML源码段为:

<tr class="abc">
    <td align="center">1</td>
    <td align="center">text1</td>
    <td class="tits"><a target="_blank" href="http://xxxx.xxx/xxx">text2</a>
        <div class="xxx">
            <table class="xxxx">
                <tbody>
                <tr>
                    <td><span>text3</span></td>
                    <td>text4</td>
                    <td><span>text5</span></td>
                    <td>text6</td>
                </tr>
                <tr>
                    <td><span>text6</span></td>
                    <td><span>text7</span></td>
                    <td>text8</td>
                </tr>
                <tr>
                    <td><span>text9</span></td>
                    <td>text10</td>
                    <td><span>text11</span></td>
                </tr>
                <tr>
                    <td><span>text12</span></td>
                    <td colspan="3">text13</td>
                </tr>
                </tbody>
            </table>
        </div>
    </td>
    <td align="center">text14</td>
</tr>

假如我们已经获取到了以上HTML源码中的<tr>元素,现在希望获取到文本“text14”,可以利用以下代码实现。

zcTime = item.find_all('td')[15].get_text()

需要注意的是,使用find_all方法时,会得到元素下所有符合要求的元素,不仅包括元素的子元素,还包括子元素的子元素,以及子元素的子元素的子元素......(无线套娃~~),因此在以上HTML源码段中text14所在的位置是在bs4获取的第15个<td>元素中。

参考链接:https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/

posted @ 2021-08-13 12:01  逸笔  阅读(259)  评论(0编辑  收藏  举报