使用beautifulsoup python在跨类HTML中刮取值
我正在尝试在一个span类中刮取数据,并使用Beautifulsoup将该数据放入一个数据帧中。到目前为止,我已经成功地找到了网页的正确位置。但似乎无法勉强找到“快乐”、“悲伤”旁边的关键词和数字使用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
更多统计信息,
更多统计数据
如果有人能帮我找出快乐和悲伤旁边的所有数字,并将它们作为数据框中的列,那将非常有帮助
非常感谢您可以这样做
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%