【问题标题】:How to scrape between span tags using beautifulsoup如何使用beautifulsoup在跨度标签之间刮擦
【发布时间】:2015-03-17 22:20:05
【问题描述】:

我正在尝试使用 python+beautifulsoup 抓取文本。我输入如下代码:

soup.find_all("span")[0]

这让我明白了:

<span style="margin-right: 0.9em">TEXT1 <span style="color:
#111111; margin-left: 0.2em">TEXT2 </span>TEXT3 </span>

这很棒。但问题是我想分别提取TEXT1TEXT2TEXT3

我不知道该怎么做。如果我这样做:

soup.find_all("span")[0].find_all("span"),我只得到

<span style="color:
#111111; margin-left: 0.2em">TEXT2 </span>

我认为这是因为这个特定的包含&lt;span&gt;&lt;/span&gt;。如何选择TEXT1TEXT2TEXT3

【问题讨论】:

    标签: python web-scraping beautifulsoup


    【解决方案1】:

    这是一个使用 text 属性完成工作的 sn-p。

    In [3]: soup = BeautifulSoup('<span style="margin-right: 0.9em">TEXT1 <span style="color:#111111; margin-left: 0.2em">TEXT2 </span>TEXT3 </span>')
       ...:
    
    In [4]: soup
    Out[4]: <html><body><span style="margin-right: 0.9em">TEXT1 <span style="color:#111111; margin-left: 0.2em">TEXT2 </span>TEXT3 </span></body></html>
    
    In [5]: soup.text
    Out[5]: u'TEXT1 TEXT2 TEXT3 '
    

    您也可以剥离和拆分输出。

    In [7]: soup.text.strip().split()
    Out[7]: [u'TEXT1', u'TEXT2', u'TEXT3']
    

    【讨论】:

    • 如果TEXTn 包含空格?如何区分TEXTi 的结尾和TEXTj 的开头?
    • 这很好用。我唯一需要弄清楚的是如何处理 TEXT2 超过 1 个单词的情况。换句话说,它在字符串的中间包含一个空格。
    • @bill999 是的,正如 jedwards 指出的那样,这在这种情况下是行不通的。
    • @bill999,无论如何感谢您对简单案例的快速解决。
    【解决方案2】:

    稍微格式化一下,我们就可以看出你有什么样的结构:

    <span style="margin-right: 0.9em">
        TEXT1 
        <span style="color:#111111; margin-left: 0.2em">
            TEXT2 
        </span>
        TEXT3
    </span>
    

    因此,很遗憾,我们不能使用like this one 方法,因为我们想在多个深度访问NavigableText 元素。

    一种方法是创建一个函数,递归检查某个给定元素的子元素(在下面的函数中称为context),如果它们是NavigableText 元素,则将它们收集起来并返回。

    考虑:

    from bs4.element import NavigableString, Tag
    
    def extractNavigableStrings(context):
        strings = []
        for e in context.children:
            if isinstance(e, NavigableString):
                strings.append(e)
            if isinstance(e, Tag):
                strings.extend(extractNavigableStrings(e))
        return strings
    

    我们可以根据您的输入运行:

    from bs4 import BeautifulSoup
    from bs4.element import NavigableString, Tag
    
    def extractNavigableStrings(context):
        strings = []
        for e in context.children:
            if isinstance(e, NavigableString):
                strings.append(e)
            if isinstance(e, Tag):
                strings.extend(extractNavigableStrings(e))
        return strings
    
    soup = BeautifulSoup('''<span style="margin-right: 0.9em">TEXT1 <span style="color: #111111; margin-left: 0.2em">TEXT2 </span>TEXT3 </span>''')
    
    print(extractNavigableStrings(soup))
    

    print 函数显示我们的NavigableStrings 列表

    [u'TEXT1', u'TEXT2', u'TEXT3']

    请注意,返回列表的元素不是 python 字符串,它们是NavigableString 元素——打印它们很好,但如果你想获取字符串内容,你会想要unicode(&lt;element&gt;)。例如:

    nss = extractNavigableStrings(soup)
    strings = [unicode(ns.string) for ns in nss]
    print strings  # [u'TEXT1 ', u'TEXT2 ', u'TEXT3 ']
    
    for s in strings: print type(s), s
    # <type 'unicode'> TEXT1
    # <type 'unicode'> TEXT2
    # <type 'unicode'> TEXT3
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-27
      • 1970-01-01
      • 1970-01-01
      • 2014-09-25
      • 1970-01-01
      相关资源
      最近更新 更多