我正在抓取位于页面不同位置的元素。我当前的代码有些工作,但会随机不返回该值。当我设置 seller = None 时,它会生成值 None 的其他实例,而它应该是卖家名称。
我的目标是根据唯一位置抓取 100 个页面以获取单个元素(并继续添加新的元素)元素的位置)并且如果元素不在页面上,则元素等于 None。
我尝试过 for 语句、if / else 语句,最近使用 try / except 第一次尝试并得到了一些工作代码(感谢 stackoverflow)查看元素是否位于特定区域,如果不在,则移动到另一个区域。再说一次,这不是 100% 有效。
soup = BeautifulSoup(r.text, 'lxml')
if url == product_url:
try:
loc1 = soup.find('div', attrs={'id':'availability-brief', 'class':'a-
section a-spacing-none'})
seller = loc1.find('a', href=re.compile('dp_merchant'), attrs=
{'id':'sellerProfileTriggerId'}).text.strip()
except:
try:
loc2 = soup.find('div', attrs={'id':'sns-availability', 'class':'a-
section a-spacing-none'})
seller = loc2.find('span', text = re.compile('text'), attrs=
{'class':'a-size-base'}).text.strip()
except:
seller = None
print(seller)
prod_dict = {'seller':seller}
print(url)
print(prod_dict)
当使用我的代码时,我将获取卖家名称,如果不存在,它将返回无,但当实际卖家名称存在时,将其他返回值设置为“无”。如果再次运行该代码,它可能不会像以前那样返回卖家名称。例如:运行 1 ,第 1 页:卖家名称 = foo.运行 2,第 1 页:卖家名称 = 无。 我希望代码搜索指定的位置并返回文本,如果不在指定的位置,则 seller = None 并继续浏览所有页面。并且还能够在发现新位置时添加它们。谢谢!
我明白你想做的事情了。你遇到的问题是在抓取网页数据时很常见的,尤其是当网页结构不一致的时候。让我们来优化一下你的代码,使其能够更稳定地抓取卖家信息。
改进后的代码:
import re
from bs4 import BeautifulSoup
def extract_seller(soup):
"""
从BeautifulSoup对象中提取卖家信息。
Args:
soup: BeautifulSoup对象,表示产品页面。
Returns:
字符串:卖家名称,如果找不到则返回None。
"""
# 尝试第一个位置
loc1 = soup.find('div', attrs={'id':'availability-brief', 'class':'a-section a-spacing-none'})
if loc1:
seller_link = loc1.find('a', href=re.compile('dp_merchant'), attrs={'id':'sellerProfileTriggerId'})
if seller_link:
return seller_link.text.strip()
# 尝试第二个位置
loc2 = soup.find('div', attrs={'id':'sns-availability', 'class':'a-section a-spacing-none'})
if loc2:
seller_span = loc2.find('span', text=re.compile('Sold by'), attrs={'class':'a-size-base'})
if seller_span:
# 注意:这里需要根据实际情况调整正则表达式,提取卖家名称
seller_name = re.search(r'Sold by\s*(.*)', seller_span.text.strip()).group(1)
return seller_name
# 如果都找不到,返回None
return None
# 示例用法
prod_dicts = []
for page_num in range(1, 101): # 抓取100个页面
# 构建页面URL(你需要根据实际情况修改)
url = f'https://www.example.com/products?page={page_num}'
# 发送请求并解析页面
r = requests.get(url)
soup = BeautifulSoup(r.text, 'lxml')
seller = extract_seller(soup)
prod_dict = {'seller': seller, 'url': url}
prod_dicts.append(prod_dict)
print(prod_dict)
代码解释:
-
函数化:
我们把提取卖家信息的逻辑封装到
extract_seller
函数中,使代码更清晰易懂。 -
逐步检查:
在每个位置,我们先检查是否存在对应的
div
元素,然后再查找卖家信息,避免了AttributeError
的发生。 -
正则表达式:
使用更精确的正则表达式
re.compile('Sold by')
来查找第二个位置的卖家信息。 -
循环抓取:
使用循环来遍历所有页面,并将提取到的信息存储到
prod_dicts
列表中。
其他建议:
-
使用try-except:
可以考虑在
requests.get(url)
和soup = BeautifulSoup(r.text, 'lxml')
周围添加try-except
语句,以捕获网络请求和页面解析过程中可能出现的错误。 -
添加延迟:
为了避免给服务器造成过大压力,建议在每次请求之间添加一些延迟,例如使用
time.sleep(1)
。 - 检查网页结构: 在编写代码之前,最好先仔细观察目标网页的结构,找出卖家信息的具体位置和规律。
希望这些改进能够帮助你更稳定地抓取到卖家信息!如果你还有其他问题,请随时提出。
标签:python,web-scraping,beautifulsoup,element From: 56690965