【问题标题】:Scrape values inside span class HTML with beautifulsoup python使用beautifulsoup python在跨度类HTML中刮取值
【发布时间】:2018-09-17 18:09:28
【问题描述】:

我正在尝试在 span 类中抓取数据,并使用 Beautifulsoup 将该数据放入 DataFrame 中。到目前为止,我已经成功到达网页的正确位置。但是好像不能抓取“幸福”、“悲伤”旁边的关键词和数字。

<span class="text-border tooltips" data-original-title="Happiness 84%
 Sadness 80%
 " data-placement="left" data-toggle="tooltip">More stats</span>,
 <span class="text-border tooltips" data-original-title="Happiness 70%
 Sadness 59%
 " data-placement="left" data-toggle="tooltip">More stats</span>

如果有人能帮我找出幸福和悲伤旁边的所有数字,并将它们作为 pandas DataFrame 中的列,那将非常有帮助。

非常感谢

【问题讨论】:

  • 我用过: features = soup.find_all(class_='text-border tooltips') 到这部分和 dataoriginal = soup.find_all(class_='data-original-title')不幸的是,这给了我一个空单元格

标签: python pandas web-scraping beautifulsoup


【解决方案1】:

如果保证所有跨度都有一个数据原始标题...并且如果标题始终采用"Happiness&lt;SPACE&gt;&lt;PERCENTAGE&gt;&lt;NEW LINE&gt;Sadness&lt;SPACE&gt;&lt;PERCENTAGE&gt;" 的格式,那么下面的内容应该适合您。

>>> import itertools
>>> import re
>>> import pandas as pd
>>> import bs4
>>> html = """<span class="text-border tooltips" data-original-title="Happiness 84%
...  Sadness 80%
...  " data-placement="left" data-toggle="tooltip">More stats</span>,
...  <span class="text-border tooltips" data-original-title="Happiness 70%
...  Sadness 59%
...  " data-placement="left" data-toggle="tooltip">More stats</span>"""
>>> soup = bs4.BeautifulSoup(html, 'lxml')
>>> all_rows = []
>>> for span in soup.find_all('span'):
...     title_eles = re.split(' |\n', span['data-original-title'])
...     title_eles = list(filter(None, title_eles))
...     row = dict(itertools.zip_longest(title_eles[::2], title_eles[1::2], fillvalue=""))
...     all_rows.append(row)
...
>>> pd.DataFrame(all_rows)
  Happiness Sadness
0       84%     80%
1       70%     59%

soup.find_all(class_='data-original-title') 返回空的原因也是因为data-original-title 是 HTML 中的一个属性。这不是一门课。

【讨论】:

  • 您好,感谢您的回答,我收到一个错误:NameError: name 'all_rows' is not defined。使用以下方法修复:all_rows = [ ]
【解决方案2】:

你可以这样做

from bs4 import BeautifulSoup

s = """
<span class="text-border tooltips" data-original-title="Happiness 84%
 Sadness 80%
 " data-placement="left" data-toggle="tooltip">More stats</span>,
 <span class="text-border tooltips" data-original-title="Happiness 70%
 Sadness 59%
 " data-placement="left" data-toggle="tooltip">More stats</span>
"""

soup = BeautifulSoup(s, "lxml")
spans = soup.find_all("span") #get all spans
for span in spans:
    data = span["data-original-title"].split("\n") #get attr and split by \n 
    happiness = data[0][:-1].replace("Happiness ", "") #remove % and remove words
    sadness = data[1][:-1].replace("Sadness ", "")
    print("{} {}".format(happiness, sadness))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-10
    • 2018-12-05
    • 2020-07-05
    相关资源
    最近更新 更多