抓取 p 标签内的 i 和 span 标签的值
Scraping values of i and span tag that are inside of a p tag
我正在尝试从下面的代码中抓取发布日期和下载次数
<p><i class="no-flip-over">Release date</i> : <span class="no-flip-over">2022-06-02</span></p>
<p><i class="no-flip-over">Downloads</i> : <span class="no-flip-over" data-times-funtouch="">703</span></p>
这是我用来抓取它的函数
def phone_data(url):
r = requests.get(url)
sp = BeautifulSoup(r.text, 'lxml')
data = {
"Release_Date" : sp.select_one('i.no-flip-over').text.strip().replace('\n', ' '),
"Downloads" : sp.select_one('i.no-flip-over').text.strip().replace('\n', ' '),
}
print(data)
phone_data('https://www.vivo.com/in/support/upgradePackageData?id=132')
这是我的输出:
{'Release_Date': '', 'Downloads': ''}
我看不到字典中除了键以外的值
除了 class 之外,我还会使用 :-soup-contains
作为目标,并根据需要删除作为相邻元素的跨度。您可以使用相邻兄弟组合器从最初由 class 和 :-soup-contains
匹配的元素移动到相邻跨度。
然后您可以避免重复相同的信息两次,并且可以删除对 strip()
和 replace()
的调用。
def phone_data(url):
r = requests.get(url)
sp = BeautifulSoup(r.text, 'lxml')
data = {
"Release_Date" : sp.select_one('.no-flip-over:-soup-contains("Release date") + span').text,
"Downloads" : sp.select_one('.no-flip-over:-soup-contains("Downloads") + span').text,
}
print(data)
phone_data('https://www.vivo.com/in/support/upgradePackageData?id=132')
@QHarr 提供的解决方案实际上我还建议您确切了解要抓取的事实,因此这只是来自其他站点的替代方案,可能适合问题的标题好一点
简单地迭代所有规范并创建一个包含键值对的字典:
data = dict(e.text.split(' : ',1) for e in sp.select('.msg h1 ~ p:has(i+span)'))
当然你会因为这两个事实而抓取更多,但也会对所有 .keys()
有一个很好的了解,也许有一些错别字,...你可以在 [=26] 中选择一个调整=]处理中。
例子
import requests
from bs4 import BeautifulSoup
def phone_data(url):
r = requests.get(url)
sp = BeautifulSoup(r.text, 'lxml')
data = dict(e.text.split(' : ',1) for e in sp.select('.msg h1 ~ p:has(i+span)'))
return data
phone_data('https://www.vivo.com/in/support/upgradePackageData?id=132')
{'Release date': '2022-02-25',
'File size': '1.87M',
'Downloads': '3545',
'Support system': 'Windows'}
我正在尝试从下面的代码中抓取发布日期和下载次数
<p><i class="no-flip-over">Release date</i> : <span class="no-flip-over">2022-06-02</span></p>
<p><i class="no-flip-over">Downloads</i> : <span class="no-flip-over" data-times-funtouch="">703</span></p>
这是我用来抓取它的函数
def phone_data(url):
r = requests.get(url)
sp = BeautifulSoup(r.text, 'lxml')
data = {
"Release_Date" : sp.select_one('i.no-flip-over').text.strip().replace('\n', ' '),
"Downloads" : sp.select_one('i.no-flip-over').text.strip().replace('\n', ' '),
}
print(data)
phone_data('https://www.vivo.com/in/support/upgradePackageData?id=132')
这是我的输出:
{'Release_Date': '', 'Downloads': ''}
我看不到字典中除了键以外的值
除了 class 之外,我还会使用 :-soup-contains
作为目标,并根据需要删除作为相邻元素的跨度。您可以使用相邻兄弟组合器从最初由 class 和 :-soup-contains
匹配的元素移动到相邻跨度。
然后您可以避免重复相同的信息两次,并且可以删除对 strip()
和 replace()
的调用。
def phone_data(url):
r = requests.get(url)
sp = BeautifulSoup(r.text, 'lxml')
data = {
"Release_Date" : sp.select_one('.no-flip-over:-soup-contains("Release date") + span').text,
"Downloads" : sp.select_one('.no-flip-over:-soup-contains("Downloads") + span').text,
}
print(data)
phone_data('https://www.vivo.com/in/support/upgradePackageData?id=132')
@QHarr 提供的解决方案实际上我还建议您确切了解要抓取的事实,因此这只是来自其他站点的替代方案,可能适合问题的标题好一点
简单地迭代所有规范并创建一个包含键值对的字典:
data = dict(e.text.split(' : ',1) for e in sp.select('.msg h1 ~ p:has(i+span)'))
当然你会因为这两个事实而抓取更多,但也会对所有 .keys()
有一个很好的了解,也许有一些错别字,...你可以在 [=26] 中选择一个调整=]处理中。
例子
import requests
from bs4 import BeautifulSoup
def phone_data(url):
r = requests.get(url)
sp = BeautifulSoup(r.text, 'lxml')
data = dict(e.text.split(' : ',1) for e in sp.select('.msg h1 ~ p:has(i+span)'))
return data
phone_data('https://www.vivo.com/in/support/upgradePackageData?id=132')
{'Release date': '2022-02-25',
'File size': '1.87M',
'Downloads': '3545',
'Support system': 'Windows'}