我正在抓取网页,但无法将信息映射到数据框。HTML 中没有表格。下面是一个 HTML 示例:
html= [
<h2>Event Title<h2>
<div class="row">
<h4>Category 1<h4>
<div>A<div>
<h4>Category 2<h4>
<div>B<div>
<h4>Category 3<h4>
<div>C<div>
<h4>Category 4<h4>
<div>D<div>
]
这是我在 python 中使用 requests 和 Beautifulsoup 的代码:
data = []
event = soup.find('h2')
for i in soup.find_all('div', {'class': 'row'}):
categories = [x.text for x in i.findAll('h4')]
info = [x.text for x in i.findAll('div')]
datum = {'event': event.get_text().replace('\n', '').replace('\r', ''),
'categories ': categories ,
'info ': info }
data.append(datum)
df = pd.DataFrame(data)
df
数据框最终看起来像一个事件标题和两个列表:
index - event - categories - info
1 - Event Title - ['Category 1','Category 2','Category 3','Category 4'] - ["Category 1 \n A\n Category 2\n B\n Category 3\n C\n Category 4\n D\n"]
我希望它以某种方式映射以最终使 h4 类别 1 与 div A 相关。
index - event - categories - info
1 - Event Title - Category 1 - A
2 - Event Title - Category 2 - B
3 - Event Title - Category 3 - C
4 - Event Title - Category 4 - D
由于 h4 和 div 是兄弟姐妹而不是 parent-child ,因此可以在我的网络抓取代码中将其分开吗?我有多个具有不同事件标题的页面,并且数据太大而无法手动完成。
除其他外,我还尝试过:
data = []
event = soup.find('h2').get_text()
for i in soup.find_all('div', {'class': 'row'}):
categories = [x.text for x in soup.findAll('h4')]
cats = soup.find_all('h4')
cat = cats[3]
info = cat.findNextSiblings('div')
datum = {'event': event, 'categories ': categories , 'info': info}
data.append(datum)
df1 = pd.DataFrame(data)
df1
这个结果给了我一个df:
index - event - categories - info
1 - Event Title - ['Category 1','Category 2','Category 3','Category 4'] - [<div>A<div>, <div>B<div>, <div>C<div>, <div>D<div>]
这是检查元素的网络链接: https ://www.ibjjfdb.com/ChampionshipResults/926/PublicResults
任何想法都会有所帮助。谢谢!