硒网上刮ebay

时间:2019-12-03 08:39:13

标签: python html selenium

嗨,我对编码非常陌生,我正在研究一个使用硒从eBay抓取数据的项目。

我遇到了2个问题。

  1. 列表名称的XPath为 listing >=1 我怎么能告诉python我想要每个列表,即//*[@id="srp-river-results-listing1"]/div/div[2]/div[3]/div[1]/span

  2. 用于清单价格的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

1 个答案:

答案 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)