【问题标题】:Extra newline character for children of Beautiful SoupBeautiful Soup 的孩子的额外换行符
【发布时间】:2015-03-24 23:52:36
【问题描述】:

我在 html 的 sn-p 上使用BeautifulSoup,如下所示:

 s = """<div class="views-row views-row-1 views-row-odd views-row-  first">
            <span class="views-field views-field-title"> 
                <span class="field-content"><a href="/party-pictures/2015/love-heals">Love Heals</a>
                </span> 
            </span>
            <span class="views-field views-field-created"> 
                <span class="field-content">Friday, March 20, 2015
                </span> 
           </span> 
</div>""" 

soup = BeautifulSoup(s)

为什么s.span 只返回第一个 span 标签?

此外 s.contents 返回一个长度为 4 的列表。两个 span 标签都在列表中,但第 0 和第 2 个索引是 "\n$ 换行符。换行符没有用。这是有原因的吗完成了吗?

【问题讨论】:

    标签: python html beautifulsoup html-parsing


    【解决方案1】:

    为什么s.span只返回第一个span标签?

    s.spans.find('span') 的快捷方式,它将仅找到span 标记的第一次出现

    此外 s.contents 返回一个长度为 4 的列表。两个 span 标签都在列表中,但第 0 和第 2 个索引是 "\n$ 换行符。换行符没有用。这是有原因的吗完成了吗?

    根据定义,.contents 输出所有元素子元素的列表,包括文本节点 - NavigableString class 的实例。

    如果你只想要标签,你可以使用find_all():

    soup.find_all()
    

    如果只有span标签:

    soup.find_all('span')
    

    例子:

    >>> from bs4 import BeautifulSoup
    >>> s = """<div class="views-row views-row-1 views-row-odd views-row-  first">
    ...             <span class="views-field views-field-title"> 
    ...                 <span class="field-content"><a href="/party-pictures/2015/love-heals">Love Heals</a>
    ...                 </span> 
    ...             </span>
    ...             <span class="views-field views-field-created"> 
    ...                 <span class="field-content">Friday, March 20, 2015
    ...                 </span> 
    ...            </span> 
    ... </div>""" 
    >>> soup = BeautifulSoup(s)
    >>> for span in soup.find_all('span'):
    ...     print span.text.strip()
    ... 
    Love Heals
    Love Heals
    Friday, March 20, 2015
    Friday, March 20, 2015
    

    重复的原因是有嵌套的span 元素。您可以通过不同的方式修复它。例如,您可以仅使用recursive=Falsediv 内进行搜索:

    >>> for span in soup.find('div', class_='views-row-1').find_all('span', recursive=False):
    ...     print span.text.strip()
    ... 
    Love Heals
    Friday, March 20, 2015
    

    或者,您可以使用CSS Selectors

    >>> for span in soup.select('div.views-row-1 > span'):
    ...     print span.text.strip()
    ... 
    Love Heals
    Friday, March 20, 2015
    

    【讨论】:

    • soup.find_all('span') 仍然对我不起作用。我原以为它会返回一个长度为 2 且跨度为 2 的列表,但我只得到一个长度为 1 的列表,它的类型为 bs4.element.ResultSet
    • @Ben 我已经更新了,希望对理解有所帮助。
    • 谢谢。这不像我希望的那样干净。在我看来,有两个 span 标签是 div 标签的直接子代。我在编写 html 时将其视为树结构。我认为有一种简单的方法可以通过调用 .content() 或 .children() 来获取这两个子树,感谢您的帮助
    猜你喜欢
    • 2012-10-23
    • 2014-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-08
    • 1970-01-01
    • 2016-06-10
    • 2020-07-15
    相关资源
    最近更新 更多