【问题标题】:How do I grab the text inside of a span tag in Python using Beautiful Soup如何使用 Beautiful Soup 在 Python 中获取 span 标签内的文本
【发布时间】:2021-01-24 14:46:03
【问题描述】:

我正忙着从 petango.com 上的项目列表中获取文本。下面的html截图 我使用 selenium 加载页面以使其加载。然后抓住它作为一个 bs 对象

PetSoup = BeautifulSoup(page_source, 'html.parser')

我试过了:

ul_tag = PetSoup.findAll('div', {'class': 'group details-list'})
pet_details = [i.get_text() for i in ul_tag]
print(pet_details)

这让我将所有项目作为一个列表对象(我认为),但我似乎无法解析它,因此我可以为每个项目分配变量(例如年龄:、品种:等)

['\n\nBreed: Chihuahua, Short Coat / Mix\nAge: 15y 5m Gender: Male\nColor: Black / Grey\nSpayed/Neutered: Yes\nSize: Small\nDeclawed: No\nAdoption Date: \n\n']

我也试过了:

for ultag in PetSoup.find_all('ul', {'class': 'group details-list'}):
    for litag in ultag.find_all('li'):
        print(litag.text)

这让我得到了所有的文本,但同样,似乎无法解析它以便能够分配变量

我真正想做的只是抓取 span 标签中的文本,但我似乎无法抓取它。我认为这与 span 标签的结构有关,但我似乎无法通过尝试 span 中项目的不同变体来获得它。我只是得到一个空的回报。具体跨度为:

<span data-bind="text: breed">Terrier, Rat / Mix </span> 

谁能指出我正确的方向?谢谢您的帮助! 具体页面在这里: https://www.petango.com/Adopt/Dog-Terrier-Rat-22192827

enter image description here

【问题讨论】:

    标签: python selenium web-scraping beautifulsoup


    【解决方案1】:

    要从 span 标签中提取文本,只需使用 span.text。这是我提取跨度文本的方法:

    from bs4 import BeautifulSoup
    
    html = '<span data-bind="text: breed">Terrier, Rat / Mix </span>'
    
    soup = BeautifulSoup(html,'html.parser')
    
    span = soup.find('span')
    
    print(span.text)
    

    输出:

    Terrier, Rat / Mix 
    

    这很好用。但我更进一步从网站上抓取了所有数据。这是执行此操作的完整代码:

    from selenium import webdriver
    from bs4 import BeautifulSoup
    
    driver = webdriver.Chrome()
    
    driver.get('https://www.petango.com/Adopt/Dog-Terrier-Rat-22192827')
    
    html = driver.page_source
    
    driver.close()
    
    soup = BeautifulSoup(html,'html.parser')
    
    ul = soup.find('div',class_ = 'group details-list').ul #Gets the ul tag
    
    li_items = ul.find_all('li') #Finds all the li tags within the ul tag
    
    headings = []
    values = []
    
    for li in li_items:
        heading = li.strong.text
        headings.append(heading)
        
        value = li.span.text
        
        if value:
            values.append(value)
        else:
            values.append(None)
    

    你还可以通过将这些行添加到代码中,使用这些列表创建一个漂亮的Pandas DataFrame(以提高可读性):

    details_dict = {'Headings':headings,
                    'Values':values}
    
    df = pd.DataFrame(details_dict)
    
    print(df)
    

    输出:

           Headings              Values
    0            Breed:  Terrier, Rat / Mix
    1              Age:              11y 7m
    2            Color:       White / Black
    3  Spayed/Neutered:                 Yes
    4             Size:               Small
    5         Declawed:                  No
    6    Adoption Date:                None  
    

    希望这会有所帮助!

    【讨论】:

    • 谢谢!!!!这正是我想要做的!我从第一个屏幕上抓取了宠物详细信息 url 的列表,并正在努力从那里收集所有数据点并添加到列表中,但被该项目卡住了。再次,非常感谢您!
    • YW!一个来自我身边的卑微请求。你能支持我的回答吗?
    • 我还需要 2 个声望点来做,dah ......我得到了一些因为问题被投票支持......一旦我超过 15 分肯定会这样做。抱歉没能做得更快
    • 没关系。当你达到 15 声望时执行此操作。谢谢!
    【解决方案2】:

    没有selenium的解决方案:

    import re
    import json
    import requests 
    from bs4 import BeautifulSoup
    
    
    url = 'https://www.petango.com/Adopt/Dog-Terrier-Rat-22192827'
    ajax_url = 'https://www.petango.com/DesktopModules/Pethealth.Petango/Pethealth.Petango.DnnModules.AnimalDetails/API/Main/GetAnimalDetails?moduleId={}&animalId={}&clientZip=null'
    headers = {'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:81.0) Gecko/20100101 Firefox/81.0',}
    
    html_text = requests.get(url, headers=headers).text
    soup = BeautifulSoup(html_text, 'html.parser')
    
    animal_id = url.split('-')[-1]
    module_id = soup.select_one('[id^="Module-"]:has(.pet-id)')['id'].split('-')[-1]
    tab_id = re.search(r'`sf_tabId`:`(\d+)`', html_text).group(1)
    
    headers['TabId'] = tab_id
    data = json.loads( requests.get(ajax_url.format(module_id, animal_id), headers=headers).text ) 
    
    # print data to screen:
    print(json.dumps(data, indent=4))
    

    打印:

    {
        "id": 22192827,
        "speciesId": 1,
        "species": "Dog",
        "name": "Charlie 3",
        "photo": "https://g.petango.com/photos/1488/6955fc68-7a2e-4da1-af34-930c5fabd713.jpg",
        "photo2": "https://g.petango.com/photos/1488/450f6d7d-e501-475c-9b1f-9322dbc225eb.jpg",
        "photo3": "https://g.petango.com/photos/1488/4fbdbf1e-58b0-45c8-8c12-b5122ad1fff8.jpg",
        "youtubeVideoId": null,
        "age": "11y 7m",
        "distance": 0,
        "gender": "Male",
        "breed": "Terrier, Rat / Mix",
        "color": "White / Black",
        "spayedNeutered": "Yes",
        "size": "Small",
        "memo": null,
        "noDogs": false,
        "noCats": false,
        "noKids": false,
        "addToFavorites": false,
        "removeFromFavorites": false,
        "adoptionDate": null,
        "declawed": false,
        "adoptionApplicationUrl": "https://www.petango.com/Adoption-Application?shelterId=1897&animalId=22192827",
        "shelterName": "OH",
        "shelterCityState": "CINCINNATI, OH"
    }
    

    【讨论】:

      猜你喜欢
      • 2017-12-31
      • 1970-01-01
      • 2019-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-22
      • 2018-06-29
      • 1970-01-01
      相关资源
      最近更新 更多