knxmy 发表于 2020-6-6 11:14

python 提取同级标签相邻标签下的value

本帖最后由 knxmy 于 2020-6-6 19:35 编辑

html如下

<td class="a-item name">出生日期</td>
<dd class="a-item value">1933</dd>
<td class="a-item name">出生地</td>
<dd class="a-item value">河南省</dd>
<td class="a-item name">死亡日期</td>
<dd class="a-item value">2015</dd>
<td class="a-item name">获奖情况</td>
<dd class="a-item value">aaaaa</dd>
# 获取到所有td和dd的值
all_a_Item = soup.find_all("dt", class_="a-item name",)
all_a_value = soup.find_all("dd", class_="a-item value")

现在只想要出生日期和死亡日期。如何获取。
以上只是举个例子,实际情况没有奇偶性规律,也没有顺序规律,出生日期,死亡日期不一定出现在哪个位置。

沐雨红尘 发表于 2020-6-6 11:33

萋小磊 发表于 2020-6-6 11:48

获取数组 得奇数
只要你想 方法很多

knxmy 发表于 2020-6-6 11:54

萋小磊 发表于 2020-6-6 11:48
获取数组 得奇数
只要你想 方法很多

我只是举个例子,实际情况没有奇偶性的规律

knxmy 发表于 2020-6-6 11:55

沐雨红尘 发表于 2020-6-6 11:33
为什么不用js呢

爬虫啊,怎么用js我不会。。。

猫南北爱上狗东西 发表于 2020-6-6 12:10

本帖最后由 猫南北爱上狗东西 于 2020-6-6 12:19 编辑

from bs4 import BeautifulSoup
html='''
<td class="a-item name">出生日期</td>
<dd class="a-item value">1933</dd>
<td class="a-item name">出生地</td>
<dd class="a-item value">河南省</dd>
<td class="a-item name">死亡日期</td>
<dd class="a-item value">2015</dd>
<td class="a-item name">获奖情况</td>
<dd class="a-item value">aaaaa</dd>
'''
soup = BeautifulSoup(html,'lxml')
born_data=soup.select("dd:nth-of-type(1)").contents
die_data=soup.select("dd:nth-of-type(3)").contents
print(born_data,die_data)

soup的css选择器应该可以,要是你会xpath的话,用xpath会更简单一点

knxmy 发表于 2020-6-6 12:19

猫南北爱上狗东西 发表于 2020-6-6 12:10
from bs4 import BeautifulSoup
html='''
出生日期


实际上每个页面的数据没有排序关系呀,出生日期不一定是第一个,排列顺序也不是我这样的,不知道我说明白没。。,还有解决办法吗

猫南北爱上狗东西 发表于 2020-6-6 13:04

knxmy 发表于 2020-6-6 12:19
实际上每个页面的数据没有排序关系呀,出生日期不一定是第一个,排列顺序也不是我这样的,不知道我说明白 ...

那先找到出生日期节点,再找到它的相邻元素,再提取内容,这样可以吗
from scrapy.selector import Selector

html='''
<td class="a-item name">出生日期</td>
<dd class="a-item value">1933</dd>
<td class="a-item name">出生地</td>
<dd class="a-item value">河南省</dd>
<td class="a-item name">死亡日期</td>
<dd class="a-item value">2015</dd>
<td class="a-item name">获奖情况</td>
<dd class="a-item value">aaaaa</dd>
'''
selector = Selector(text=html)
born_data=selector.css('td:contains("出生日期")+dd::text').extract()
die_data=selector.css('td:contains("死亡日期")+dd::text').extract()

涛之雨 发表于 2020-6-6 13:36

本帖最后由 涛之雨 于 2020-6-6 14:08 编辑

也可以用正则啊。。
不管顺序怎么变,
td和dd标签肯定是一组吧。。
去掉回车,直接匹配就成了

#!/usr/bin/env python3
import re
html='''
<td class="a-item name">出生日期</td>
<dd class="a-item value">1933</dd>
<td class="a-item name">出生地</td>
<dd class="a-item value">河南省</dd>
<td class="a-item name">死亡日期</td>
<dd class="a-item value">2015</dd>
<td class="a-item name">获奖情况</td>
<dd class="a-item value">aaaaa</dd>
'''

print("=====================================\n"+html+"\n=====================================")

html=html.replace('\n',"")
born=re.search(r'出生日期.+?\d+',html).group()
born=re.search(r'\d+',born).group()
die=re.search(r'死亡日期.+?\d+',html).group()
die=re.search(r'\d+',die).group()
print("出生日期:\t"+born+"\n死亡日期:\t"+die)
input()
https://i.loli.net/2020/06/06/WNbiQaZlnVU4CE1.png

当然也可以用“组”获取
html=xxxxxx#赋值一样的
html=html.replace('\n',"")
born=re.search(r'出生日期.+?(\d+)',html).group(1)
die=re.search(r'死亡日期.+?(\d+)',html).group(1)
print("出生日期:\t"+born+"\n死亡日期:\t"+die)
把数字转换成组然后输出。。。不过我不大喜欢(虽然这样更简便,而且效率更高)
但是debug的时候会更难判断

namedlxd 发表于 2020-6-6 14:02

如果没有其他日期的情况下,可以找两个四位数字,小的是出生日期,大的是死亡日期。
页: [1] 2 3
查看完整版本: python 提取同级标签相邻标签下的value