【问题标题】:How to use beautiful soup to extract only one element from a class?如何使用漂亮的汤从一个类中只提取一个元素?
【发布时间】:2020-02-21 21:29:16
【问题描述】:

我正在尝试使用 BeautifulSoup 抓取筹款信息,但在尝试隔离诸如为筹款目标筹集的金额等元素时遇到了麻烦。

这是目前为止的代码:

from bs4 import BeautifulSoup
import numpy as np
import pandas as pd
from time import sleep
import requests
import re
import json

page = requests.get("https://www.gofundme.com/f/eric-stevens-care-trust")
soup = BeautifulSoup(page.text, 'lxml')
Amount_raised = soup.find_all('h2', class_='m-progress-meter-heading')[0].get_text()

代码有效,但是当我查看结果时,它看起来像这样:

print(Amount_raised)
882,521 $ raised of 1,000,000 $ goal

理想情况下,我希望只返回数字“882,521”,或者更好的是,将它们解析为两个变量,一个是筹集的金额,另一个是筹款目标。

我觉得应该有一种方法可以指定我想要的元素,或者使用正则表达式来隔离它,但是我的搜索没有成果,而且我对 python 还很陌生。

编辑:这是我尝试使用的 HTML 部分

<h2 class="m-progress-meter-heading">882,521 $<!-- --> <span class="text-stat text-stat-title">raised of 1,000,000 $ goal</span>

【问题讨论】:

标签: python html beautifulsoup


【解决方案1】:

我发现最简单的方法是:

Amount_raised = soup.find_all('h2', class_='m-progress-meter-heading')
print(Amount_raised[0].contents[0])

打印 $882,521


在这里找到解决方案:Only extracting text from this element, not its children

【讨论】:

  • 它是如此简短和容易。我喜欢它。
【解决方案2】:

如果您想同时获得目标和实际筹集的金额,请尝试:

amts = Amount_raised.split(' ')
locs = [i for i, x in enumerate(amts) if  "$" in x]
print('Amount raised: $'+amts[locs[0]-1])
print('Goal : $'+amts[locs[1]-1])

输出:

Amount raised: $882,521
Goal : $1,000,000

【讨论】:

    【解决方案3】:

    你可以使用你得到的文本

    Amount_raised.split(" ")[0]
    

    完整代码:

    from bs4 import BeautifulSoup
    import requests
    
    page = requests.get("https://www.gofundme.com/f/eric-stevens-care-trust")
    soup = BeautifulSoup(page.text, 'lxml')
    
    Amount_raised = soup.find_all('h2', class_='m-progress-meter-heading')[0].get_text()
    print(Amount_raised.split(" ")[0])
    

    你也可以跳过.get_text(),然后你可以从&lt;h2&gt;中找到并删除标签&lt;span&gt;(使用.extrude()),接下来你可以使用.get_text()从&lt;h2&gt;获取文本

    item = soup.find_all('h2', class_='m-progress-meter-heading')[0]
    item.find('span').extrude()
    Amount_raised = item.get_text()
    

    完整代码:

    from bs4 import BeautifulSoup
    import requests
    
    page = requests.get("https://www.gofundme.com/f/eric-stevens-care-trust")
    soup = BeautifulSoup(page.text, 'lxml')
    
    item = soup.find_all('h2', class_='m-progress-meter-heading')[0]
    item.find('span').extract()
    Amount_raised = item.get_text()
    print(Amount_raised)
    

    您还可以在&lt;h2&gt; 中获取包含所有strings 的列表,然后来自&lt;span&gt; 的文本将作为列表中的分隔元素

    item = soup.find_all('h2', class_='m-progress-meter-heading')[0]
    print( list(item.strings)[0] )
    

    完整代码:

    from bs4 import BeautifulSoup
    import requests
    
    page = requests.get("https://www.gofundme.com/f/eric-stevens-care-trust")
    soup = BeautifulSoup(page.text, 'lxml')
    
    item = soup.find_all('h2', class_='m-progress-meter-heading')[0]
    print(list(item.strings)[0])
    

    编辑:其他示例:

    item = soup.find_all('h2', class_='m-progress-meter-heading')[0]
    
    print( item.next )
    print( list(item.children)[0] )
    

    【讨论】:

      猜你喜欢
      • 2021-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-05
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      • 2019-11-06
      相关资源
      最近更新 更多