Python 如何从特定表元素中刮取特定文本

Python 如何从特定表元素中刮取特定文本,python,html,web-scraping,beautifulsoup,Python,Html,Web Scraping,Beautifulsoup,我试图从Amazon产品页面上的特定表元素中提取特定文本 URL_1包含所有元素- URL_2只有“销售排名”—— URL_1: “产品详细信息”表有9个项目,我只对“产品尺寸”、“装运重量”、项目型号和所有“卖方排名”感兴趣 我无法解析这些项目上的文本,因为有些项目位于一个代码块中,而其他项目则不在其中 我使用的是beautifulsoup,我在桌子上运行了一个text.strip(),结果一切都变得非常混乱。我尝试了soup.find('li')和text.strip()来查找单个元素,但对

我试图从Amazon产品页面上的特定表元素中提取特定文本

URL_1包含所有元素- URL_2只有“销售排名”——

URL_1: “产品详细信息”表有9个项目,我只对“产品尺寸”、“装运重量”、项目型号和所有“卖方排名”感兴趣

我无法解析这些项目上的文本,因为有些项目位于一个代码块中,而其他项目则不在其中

我使用的是beautifulsoup,我在桌子上运行了一个text.strip(),结果一切都变得非常混乱。我尝试了soup.find('li')和text.strip()来查找单个元素,但对于seller-rank,它在一次返回中返回所有3个混乱的列。我也尝试过正则表达式来清理文本,但它对4个不同的卖家等级无效。我已经成功地使用了Try,Except,Pass方法来进行刮片,并且每个方法都是这种格式的

A bad example of the code used, I was trying to get sales rank past the </b> 
element in the HTML
#Sales Rank
        sales_rank ='NOT'
        try:
            sr = soup.find('li', attrs={'id':'SalesRank'})
            sales_rank = sr.find('/b').text.strip()
        except:
            pass
URL_2:
页面上唯一感兴趣的元素是“销售排名”产品尺寸、装运重量、项目型号不存在。但是,我希望返回类似于URL_1的返回,但是缺少的元素的值为'NA'。与URL_1的结果相同,当元素不存在时,只给出“NA”。通过在Try/Except语句之前设置一个值,我成功地实现了这一点。装运重量='NA'。。。然后运行try/except:pass,这样我会得到'NA',并且我的字典不是空的。

您可以在bs4.7.1中使用stripped_字符串和:contains。这感觉像是为了获得所需的输出格式而做了很多手脚。当然,有更多python经验的人可以减少这种情况并提高其效率。合并dicts语法取自


哎呀。。。。我应该把问题往下滚动一点,因为我没有看到那一点!我会再看一看。你能提供一个例子url在这种情况下和预期的输出吗?请尝试一些url的底部版本。没有问题。感谢您的反馈:-)您能提供一个发生这种情况的示例url吗?
dimensions = 6x4x4
weight = 4.8 ounces
Item_No = IT-DER0-IQDU
R1_NO = 2,036
R1_CAT = Health & Household
R2_NO = 5
R2_CAT = Joint & Muscle Pain Relief Medications
R3_NO = 3
R3_CAT = Naproxen Sodium
R4_NO = 6
R4_CAT = Migraine Relief

my_dict =   {'dimensions':'dimensions','weight':'weight','Item_No':'Item_No', 'R1_NO':R1_NO,'R1_CAT':'R1_CAT','R2_NO':R2_NO,'R2_CAT':'R2_CAT','R3_NO':R3_NO,'R3_CAT':'R3_CAT','R4_CAT':'R4_CAT'}
import requests
from bs4 import BeautifulSoup as bs
import re

links = ['https://www.amazon.com/Professional-Dental-Guard-Remoldable-Customizable/dp/B07L4YHBQ4', 'https://www.amazon.com/dp/B0040ODFK4/?tag=stackoverfl08-20']

for link in links:

    r = requests.get(link, headers = {'User-Agent': 'Mozilla\5.0'})
    soup = bs(r.content, 'lxml')
    fields = ['Product Dimensions', 'Shipping Weight', 'Item model number', 'Amazon Best Sellers Rank']

    temp_dict = {}

    for field in fields:
        element = soup.select_one('li:contains("' + field + '")')
        if element is None:
            temp_dict[field] = 'N/A'
        else:
            if field == 'Amazon Best Sellers Rank':
                item = [re.sub('#|\(','', string).strip() for string in soup.select_one('li:contains("' + field + '")').stripped_strings][1].split(' in ')
                temp_dict[field] = item
            else:
                item = [string for string in element.stripped_strings][1]
                temp_dict[field] = item.replace('(', '').strip()

    ranks = soup.select('.zg_hrsr_rank')
    ladders = soup.select('.zg_hrsr_ladder')

    if ranks:
        cat_nos = [item.text.split('#')[1] for item in ranks]
    else:
         cat_nos = ['N/A']

    if ladders:                      
        cats = [item.text.split('\xa0')[1] for item in soup.select('.zg_hrsr_ladder')]
    else:
        cats = ['N/A']

    rankings = dict(zip(cat_nos, cats))

    map_dict = {
        'Product Dimensions': 'dimensions',
        'Shipping Weight': 'weight', 
        'Item model number': 'Item_No',
        'Amazon Best Sellers Rank': ['R1_NO','R1_CAT']
    }

    final_dict = {}

    for k,v in temp_dict.items():
        if k == 'Amazon Best Sellers Rank' and v!= 'N/A':
            item = dict(zip(map_dict[k],v))
            final_dict = {**final_dict, **item}
        elif k == 'Amazon Best Sellers Rank' and v == 'N/A':
            item = dict(zip(map_dict[k], [v, v]))
            final_dict = {**final_dict, **item}
        else:
            final_dict[map_dict[k]] = v

    for k,v in enumerate(rankings):
        #print(k + 1, v, rankings[v])
        prefix = 'R' + str(k + 2) + '_'
        final_dict[prefix + 'NO'] = v  
        final_dict[prefix + 'CAT'] = rankings[v]

    print(final_dict)