【问题标题】:How to get text from span tag in BeautifulSoup如何从 BeautifulSoup 中的 span 标签获取文本
【发布时间】:2016-06-30 21:44:12
【问题描述】:

我的链接看起来像这样

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

我正在尝试从那里获取1 GB。我试过了

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

它输出None

我尝试了a['text'],但它给了我 KeyError。我该如何解决这个问题,我的错误是什么?

【问题讨论】:

  • 可以分享一下周边的html吗? (或网址)
  • @PadraicCunningham 是的,请稍等
  • 也可以试试soup.select_one("span[title*=RAM]").text,如果你正在遍历列表,你已经有了文本
  • @PadraicCunningham 好吧,那行得通。请您将其发布为答案,谢谢。
  • 你确定bs4.select() 输出一个标签对象吗?这段代码是做什么的:tt = [title for title in soup.select(".systemRequirementsRamContent span[title]")]

标签: python web-scraping beautifulsoup python-3.4


【解决方案1】:

您可以使用 css 选择器,使用标题文本拉出您想要的跨度:

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)

即找到spantitle属性包含RAM,相当于python中的说法,if "RAM" in span["title"]

或者使用 findre.compile

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

获取所有数据:

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)

这会给你:

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

【讨论】:

  • 顺便说一句,我尝试 soup.select_one("span[title*=Space]").text 获得 500 MB&lt;span title="000 Plus Minimum Hard Disk Drive Space Requirement"&gt;500 MB&lt;/span&gt; &lt;div class="systemRequirementsTickOrCross"&gt;&lt;/div&gt; 但它打印出 HDD Space 我不明白为什么。
  • 您可以添加指向 html/url 的链接吗?我认为可能还有另一个包含文本 Space 的 spans 标题
  • 哦,那是因为磁盘上有 span 标签,它们的文本是HDD Space。如何指出我只想要游戏链接中的 span 标签?
  • 我的意思是我必须指出这个类 systemRequirementsSmallerBox sysReqGameSmallBox 包含我想要的文本。
  • 酷,不用担心。就 css 而言,developer.mozilla.org/en/docs/Web/Guide/CSS/Getting_started/… 向您展示了很多您可以在 bs4 中使用的东西,唯一实现的伪类是 nth-of-type 但 *= ^= > + ~ 等.. 可以使用。
【解决方案2】:

我尝试使用来自bs4 (BeautifulSoup) 的find_all() 函数提取 HTML 文档内所有 span 标签内的文本:

from bs4 import BeautifulSoup
import requests
url="YOUR_URL_HERE"
response=requests.get(url)
soup=BeautifulSoup(response.content,html5lib)
spans=soup.find_all('span',"ENTER_Css_CLASS_HERE")
for span in spans:
  print(span.text)

【讨论】:

    【解决方案3】:

    您可以在 BeautifulSoup 中简单地使用 span 标签,也可以在 span 标签中包含其他属性,例如 classtitle

    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
    

    【讨论】:

    • 即使只有一个值,为什么还要为 Beuatifulshop 结果集启动 for 循环?
    • @GautamShahi 对于给定的示例,您不需要它。但是,如果您有其他需要的跨度值,我一般会保留它。
    【解决方案4】:

    你可以用几行gazpacho来解决这个问题:

    from gazpacho import Soup
    
    html = """\
    <div class="systemRequirementsMainBox">
    <div class="systemRequirementsRamContent">
    <span title="000 Plus Minimum RAM Requirement">1 GB</span> </div>
    """
    
    soup = Soup(html)
    soup.find("span", {"title": "Minimum RAM Requirement"}).text
    # '1 GB'
    

    【讨论】:

      猜你喜欢
      • 2021-07-26
      • 1970-01-01
      • 2022-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多