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:48
获取数组 得奇数
只要你想 方法很多
我只是举个例子,实际情况没有奇偶性的规律 沐雨红尘 发表于 2020-6-6 11:33
为什么不用js呢
爬虫啊,怎么用js我不会。。。 本帖最后由 猫南北爱上狗东西 于 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会更简单一点 猫南北爱上狗东西 发表于 2020-6-6 12:10
from bs4 import BeautifulSoup
html='''
出生日期
实际上每个页面的数据没有排序关系呀,出生日期不一定是第一个,排列顺序也不是我这样的,不知道我说明白没。。,还有解决办法吗 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 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的时候会更难判断 如果没有其他日期的情况下,可以找两个四位数字,小的是出生日期,大的是死亡日期。