抓取 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'}