【问题标题】:Get text with BeautifulSoup CSS Selector使用 BeautifulSoup CSS 选择器获取文本
【发布时间】:2016-10-18 18:56:49
【问题描述】:

示例 HTML

<h2 id="name">
    ABC
    <span class="numbers">123</span>
    <span class="lower">abc</span>
</h2>

我可以通过以下方式获取数字:

soup.select('#name > span.numbers')[0].text

如何使用 BeautifulSoup 和 select 函数获取文本 ABC

在这种情况下呢?

<div id="name">
    <div id="numbers">123</div> 
    ABC
</div>

【问题讨论】:

    标签: python python-2.7 css-selectors beautifulsoup html-parsing


    【解决方案1】:

    在第一种情况下,获取previous sibling

    soup.select_one('#name > span.numbers').previous_sibling
    

    在第二种情况下,获取next sibling:

    soup.select_one('#name > #numbers').next_sibling
    

    请注意,我假设这里有意将numbers 作为id 值,并且标签是div 而不是span。因此,我调整了 CSS 选择器。


    要覆盖这两种情况,你可以去标签的父节点,以非递归方式找到非空文本节点:

    parent = soup.select_one('#name > .numbers,#numbers').parent
    print(parent.find(text=lambda text: text and text.strip(), recursive=False).strip())
    

    注意选择器的变化 - 我们要求匹配 numbers id 或 numbers 类。

    不过,我觉得这种通用解决方案不太可靠,因为对于初学者来说,我不知道您的实际输入可能是什么。

    【讨论】:

    • 是的,id 和 div 与 span 的变化是有意的。感谢您的关注!有没有办法从上一个解决方案中的父母开始,然后在案例#1 中直接选择第一个孩子,或者在案例#2 中选择第二个孩子?我试图避免使用 find 或 findAll。
    • @slaw 是的,当然,您可以使用contents 列表:tag.contents[0]tag.contents[1]。或者,通过tag.children 生成器。
    猜你喜欢
    • 2015-01-04
    • 2016-08-24
    • 2019-10-11
    • 2017-01-23
    • 2018-08-19
    • 1970-01-01
    • 2018-09-06
    • 2012-11-13
    • 1970-01-01
    相关资源
    最近更新 更多