嗨,我对编码非常陌生,我正在研究一个使用硒从eBay抓取数据的项目。
我遇到了2个问题。
列表名称的XPath为
listing >=1
我怎么能告诉python我想要每个列表,即//*[@id="srp-river-results-listing1"]/div/div[2]/div[3]/div[1]/span
?
用于清单价格的xpath
div[2]
是我直接复制的内容,但是当我将其输入python时,它表示语法无效并指向# https://www.dartlang.org/guides/language/analysis-options
analyzer:
strong-mode: true
errors:
mixin_inherits_from_not_object: ignore
,列表情况也会发生相同的情况。
但是,对于名称,运输成本和原产国,它将起作用。
我该如何避免解决这些问题?
非常感谢,我被禁止使用eBay API
答案 0 :(得分:0)
1)要按部分名称搜索,可以使用contains()
'//*[contains(@id, "srp-river-results-listing")]/div/div[2]/a/h3'
这对于类很有用,因为xpath
中的Selenium
将所有类都视为一个字符串,而xpath @class="s-item__title"
不会找到<div class="s-item__title promotion">
'//h3[contains(@class, "s-item__title")]`
您还可以使用它来按页面上显示的文本进行搜索
'//h3[contains(@text, "Raspberry")]`
2)。我不知道问题出在哪里-您没有显示完整的错误消息。
顺便说一句:您可以使用较短的xpath找到相同的项目,而不是使用较长的xpath
'//h3[contains(@class, "s-item__title")]'
和
'//span[@class="s-item__price"]'
通常,您可以尝试使用//
跳过路径中的某些元素
'//li[contains(@id, "srp-river-results-listing")]//span'
它可能不需要div[2]
有时候,找到主要标签,然后仅使用带有.
的相对xpath在此标签内进行搜索是很好的。
对有关一项的信息进行分组可能很有用。有时项目可能没有某些值,然后使用zip(all_titles, all_prices)
对信息进行分组可能会导致错误的结果。
data = []
all_items = driver.find_elements_by_xpath('//li[@class="s-item "]')
for item in all_items:
# relative xpathes
title = item.find_element_by_xpath('.//h3[contains(@class, "s-item__title")]').text.strip()
price = item.find_element_by_xpath('.//span[@class="s-item__price"]').text.strip()
data.append( [title, price] )
示例代码
import selenium.webdriver
driver = selenium.webdriver.Firefox()
driver.get('https://www.ebay.com/sch/i.html?_from=R40&_trksid=p2499334.m570.l1311.R1.TR12.TRC2.A0.H0.Xras.TRS0&_nkw=raspberry+pi+4&_sacat=0')
# --- separated elements ---
all_titles = []
all_items = driver.find_elements_by_xpath('//h3[@class="s-item__title"]')
for item in all_items:
title = item.text.strip()
print('title:', title)
all_titles.append( title )
all_prices = []
all_items = driver.find_elements_by_xpath('//span[@class="s-item__price"]')
for item in all_items:
price = item.text.strip()
print('price:', price)
all_prices.append( price )
data = list(zip(all_titles, all_prices))
all_others = []
all_items = driver.find_elements_by_xpath('//non_existing_xpath')
for item in all_items:
other = item.text.strip()
print('other:', other)
all_others.append( other )
# all_others will be empty
# --- grouped ---
data = []
all_items = driver.find_elements_by_xpath('//li[@class="s-item "]')
for item in all_items:
title = item.find_element_by_xpath('.//h3[contains(@class, "s-item__title")]').text.strip()
price = item.find_element_by_xpath('.//span[@class="s-item__price"]').text.strip()
try:
other = item.find_element_by_xpath('.//non_existing_xpath').text.strip()
except Exception as ex:
print('Exception:', ex)
other = "" # default value when element doesn't exists.
print('title:', title)
print('other:', price)
print('other:', other)
print('---')
data.append( [title, price, other])
# --- other examples ---
all_items = driver.find_elements_by_xpath('//li[contains(@id, "srp-river-results-listing")]//span[@class="s-item__price"]')
for item in all_items:
print(item.text)
all_items = driver.find_elements_by_xpath('//li[contains(@id, "listing")]//span[@class="s-item__price"]')
for item in all_items:
print(item.text)
all_items = driver.find_elements_by_xpath('//*[contains(@id, "srp-river-results-listing")]/div/div[2]/a/h3')
for item in all_items:
print(item.text)