Python 如何从特定表元素中刮取特定文本
我试图从Amazon产品页面上的特定表元素中提取特定文本 URL_1包含所有元素- URL_2只有“销售排名”—— URL_1: “产品详细信息”表有9个项目,我只对“产品尺寸”、“装运重量”、项目型号和所有“卖方排名”感兴趣 我无法解析这些项目上的文本,因为有些项目位于一个代码块中,而其他项目则不在其中 我使用的是beautifulsoup,我在桌子上运行了一个text.strip(),结果一切都变得非常混乱。我尝试了soup.find('li')和text.strip()来查找单个元素,但对于seller-rank,它在一次返回中返回所有3个混乱的列。我也尝试过正则表达式来清理文本,但它对4个不同的卖家等级无效。我已经成功地使用了Try,Except,Pass方法来进行刮片,并且每个方法都是这种格式的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()来查找单个元素,但对
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)