【问题标题】:Get data from HTML page从 HTML 页面获取数据
【发布时间】:2019-04-25 14:55:19
【问题描述】:

我有一些来自 HTML 页面的数据,如下所示

<span class="some class abc-vc"> 123</span>
<span class="some class vde-bc"> 435</span>
<span class="some class v9mo-04mg"> 456 </span>

我只想搜索

some class 

标签的一部分,以便我可以一一存储变量

我怎样才能做到这一点?

代码:

from urllib.request import Request, urlopen
import bs4 
url = 'url'
page = urlopen(url).read()
soup = bs4.BeautifulSoup(page, 'html.parser')
data = soup.find('span',{'class':'some class'})
print (data.text)

【问题讨论】:

标签: python python-3.x web-scraping beautifulsoup


【解决方案1】:

您可以使用正则表达式来查找特定项目。试试下面的代码。

from bs4 import BeautifulSoup
import re

data='''<span class="some class abc-vc"> 123</span>
<span class="some class vde-bc"> 435</span>
<span class="some class v9mo-04mg"> 456 </span>'''
soup=BeautifulSoup(data,'html.parser')

for item in soup.find_all('span',class_=re.compile('some class')):
    print(item.text)

输出:

123
435
456 

【讨论】:

  • 感谢您的回答。正则表达式实际上是我一直在寻找的,但事实证明我在寻找错误的标签。我需要的正确数据是:100你知道如何得到这个吗?
  • @user3702643 : 所以你需要这个标签的值 100 对吗?
  • 是的,正确。每行都有完全相同的标签,如下所示 100 200 300
  • 你不需要正则表达式。你可以这样找到for item in soup.find_all('span'): print(item.find('b').text)
  • for item in soup.find_all('span',style=re.compile('font-size:90%')): print(item.find('b').text) 这应该可以工作
【解决方案2】:

在 HTML 中,不同的类由空格分隔。例如,底部跨度具有三个类:someclassv9mo-04mg

要查找包含some 类和class 类的所有标签,请使用列表作为字典值:

data = soup.find('span', {'class':['some', 'class']})

如果需要多个,则将.find() 方法替换为.find_all()

【讨论】:

  • 我仍然无法获得所需的数据。我得到 AttributeError: 'NoneType' 对象没有属性 'text'
  • @user3702643 这意味着查找无效。我用您在问题中发布的 HTML 对此进行了测试,效果很好。也许print(soup) 只是为了确保一切正常
  • 你是对的。仔细观察汤,我意识到我需要的数据实际上在下面的标签中。对此有什么帮助吗? 100
【解决方案3】:

它们是复合类。你可以用“。”加入他们。并传递给选择

elements = [item for item in soup.select('.some.class')]

【讨论】:

    猜你喜欢
    • 2015-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-11
    • 2021-11-13
    • 1970-01-01
    • 1970-01-01
    • 2013-05-15
    相关资源
    最近更新 更多