web-dev-qa-db-fra.com

Comment obtenir du texte à partir d'une balise span dans BeautifulSoup

J'ai des liens qui ressemblent à ceci

<div class="systemRequirementsMainBox">
<div class="systemRequirementsRamContent">
<span title="000 Plus Minimum RAM Requirement">1 GB</span> </div>

J'essaie d'obtenir 1 GB De là. j'ai essayé

tt  = [a['title'] for a in soup.select(".systemRequirementsRamContent span")]
for ram in tt:
    if "RAM" in ram.split():
        print (soup.string)

Il génère None.

J'ai essayé a['text'] mais cela me donne KeyError. Comment puis-je résoudre ce problème et quelle est mon erreur?

10
GLHF

Vous pouvez utiliser un sélecteur css, tirant la plage que vous souhaitez en utilisant le texte du titre:

soup = BeautifulSoup("""<div class="systemRequirementsMainBox">
<div class="systemRequirementsRamContent">
<span title="000 Plus Minimum RAM Requirement">1 GB</span> </div>""", "xml")

print(soup.select_one("span[title*=RAM]").text)

Cela trouve le span avec un title attribut qui contient RAM , c'est équivalent à dire en python , if "RAM" in span["title"].

Ou en utilisant find avec re.compile

import re
print(soup.find("span", title=re.compile("RAM")).text)

Pour obtenir toutes les données:

from bs4 import BeautifulSoup 
r  = requests.get("http://www.game-debate.com/games/index.php?g_id=21580&game=000%20Plus").content

soup = BeautifulSoup(r,"lxml")
cont = soup.select_one("div.systemRequirementsRamContent")
ram = cont.select_one("span")
print(ram["title"], ram.text)
for span in soup.select("div.systemRequirementsSmallerBox.sysReqGameSmallBox span"):
        print(span["title"],span.text)

Ce qui vous donnera:

000 Plus Minimum RAM Requirement 1 GB
000 Plus Minimum Operating System Requirement Win Xp 32
000 Plus Minimum Direct X Requirement DX 9
000 Plus Minimum Hard Disk Drive Space Requirement 500 MB
000 Plus Gd Adjusted Operating System Requirement Win Xp 32
000 Plus Gd Adjusted Direct X Requirement DX 9
000 Plus Gd Adjusted Hard Disk Drive Space Requirement 500 MB
000 Plus Recommended Operating System Requirement Win Xp 32
000 Plus Recommended Hard Disk Drive Space Requirement 500 MB
8
Padraic Cunningham

Vous pouvez simplement utiliser la balise span dans BeautifulSoup ou vous pouvez inclure d'autres attributs comme class, title avec la balise span.

from BeautifulSoup import BeautifulSoup as BSHTML

htmlText = """<div class="systemRequirementsMainBox">
<div class="systemRequirementsRamContent">
<span title="000 Plus Minimum RAM Requirement">1 GB</span> </div>"""

soup = BSHTML(htmlText)
spans = soup.findAll('span')
# spans = soup.findAll('span', attrs = {'class' : 'your-class-name'}) # or span by class name
# spans = soup.findAll('span', attrs = {'title' : '000 Plus Minimum RAM Requirement'}) # or span with a title
for span in spans:
    print span.text
1
Abu Shoeb