Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用beautifulsoup python在跨类HTML中刮取值_Python_Pandas_Web Scraping_Beautifulsoup - Fatal编程技术网

使用beautifulsoup python在跨类HTML中刮取值

使用beautifulsoup python在跨类HTML中刮取值,python,pandas,web-scraping,beautifulsoup,Python,Pandas,Web Scraping,Beautifulsoup,我正在尝试在一个span类中刮取数据,并使用Beautifulsoup将该数据放入一个数据帧中。到目前为止,我已经成功地找到了网页的正确位置。但似乎无法勉强找到“快乐”、“悲伤”旁边的关键词和数字 更多统计信息, 更多统计数据 如果有人能帮我找出快乐和悲伤旁边的所有数字,并将它们作为数据框中的列,那将非常有帮助 非常感谢您可以这样做 from bs4 import BeautifulSoup s = """ <span class="text-border tooltips" data

我正在尝试在一个span类中刮取数据,并使用Beautifulsoup将该数据放入一个数据帧中。到目前为止,我已经成功地找到了网页的正确位置。但似乎无法勉强找到“快乐”、“悲伤”旁边的关键词和数字

更多统计信息,
更多统计数据
如果有人能帮我找出快乐和悲伤旁边的所有数字,并将它们作为数据框中的列,那将非常有帮助


非常感谢

您可以这样做

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))
从bs4导入美化组
s=”“”
更多统计数据,
更多统计数据
"""
汤=美汤(s,“lxml”)
span=汤。查找所有(“span”)#获取所有span
对于跨度中的跨度:
data=span[“数据原始标题”].split(“\n”)#获取属性并按分割\n
幸福=数据[0][:-1]。替换(“幸福”,“幸福”)#删除%并删除单词
悲伤=数据[1][:-1]。替换(“悲伤”,“悲伤”)
打印(“{}{}”。格式(快乐、悲伤))

如果保证所有跨度都有数据原始标题。。。如果标题总是以“快乐悲伤”的格式出现,那么下面的内容应该适合你

>>> 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%
导入itertools >>>进口稀土 >>>作为pd进口熊猫 >>>进口bs4 >>>html=“”更多统计信息, …更多统计数据“ >>>soup=bs4.BeautifulSoup(html,“lxml”) >>>所有_行=[] >>>对于汤中的span。查找所有('span'): ... title_eles=re.split(“|\n”,span['data-original-title'] ... title_eles=列表(过滤器(无,title_eles)) ... row=dict(itertools.zip_longest(title_eles[::2],title_eles[1::2],fillvalue=”“) ... 所有行。追加(行) ... >>>pd.数据帧(所有行) 快乐与悲伤 0 84% 80% 1 70% 59%
soup.find_all(class='data-original-title')
返回空的另一个原因是
data-original-title
是HTML中的一个属性。这不是一个类。

我使用了:features=soup.find_all(class='text-border tooltips')来访问这一部分,dataoriginal=soup.find_all(class='data-original-title')不幸的是,这给了我一个空单元格。您好,谢谢您的回答,我遇到了一个错误:name错误:name错误:name'all_rows'没有定义。它是使用:all_rows=[]修复的
>>> 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%