吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1889|回复: 26
收起左侧

[已解决] python 提取同级标签相邻标签下的value

 关闭 [复制链接]
knxmy 发表于 2020-6-6 11:14
本帖最后由 knxmy 于 2020-6-6 19:35 编辑

html如下
[Python] 纯文本查看 复制代码
<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

爬虫啊,怎么用js我不会。。。
猫南北爱上狗东西 发表于 2020-6-6 12:10
本帖最后由 猫南北爱上狗东西 于 2020-6-6 12:19 编辑

[Python] 纯文本查看 复制代码
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)")[0].contents[0]
die_data=soup.select("dd:nth-of-type(3)")[0].contents[0]
print(born_data,die_data)


soup的css选择器应该可以,要是你会xpath的话,用xpath会更简单一点
 楼主| knxmy 发表于 2020-6-6 12:19
猫南北爱上狗东西 发表于 2020-6-6 12:10
[mw_shl_code=python,true]from bs4 import BeautifulSoup
html='''
出生日期

实际上每个页面的数据没有排序关系呀,出生日期不一定是第一个,排列顺序也不是我这样的,不知道我说明白没。。,还有解决办法吗
猫南北爱上狗东西 发表于 2020-6-6 13:04
knxmy 发表于 2020-6-6 12:19
实际上每个页面的数据没有排序关系呀,出生日期不一定是第一个,排列顺序也不是我这样的,不知道我说明白 ...

那先找到出生日期节点,再找到它的相邻元素,再提取内容,这样可以吗
[Python] 纯文本查看 复制代码
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')[0].extract()
die_data=selector.css('td:contains("死亡日期")+dd::text')[0].extract()
涛之雨 发表于 2020-6-6 13:36
本帖最后由 涛之雨 于 2020-6-6 14:08 编辑

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

[Python] 纯文本查看 复制代码
#!/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()



当然也可以用“组”获取
[Python] 纯文本查看 复制代码
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
如果没有其他日期的情况下,可以找两个四位数字,小的是出生日期,大的是死亡日期。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止回复与主题无关非技术内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-5-29 16:13

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表