用硒蟒皮刮痧产品颜色

时间:2017-04-10 17:50:20

标签: python selenium web-scraping

enter image description here

链接到完整源代码:

http://www.supremenewyork.com/shop/all/sweatshirts

尝试从网站上刮取产品元素和颜色。我已经可以拉出产品的名称,然后点击它然后我希望能够将所有带有该特定关键字的产品拉出来,然后单击我想要的颜色。任何帮助表示赞赏。

编辑: 我试过的,

product = driver.find_elements_by_partial_link_text(keyword)
for item in product:
    if item.parent.parent.find("p") == wanted_color:
        item.get_attribute("href")

错误:

Traceback (most recent call last):   File "C:/Users/B/PycharmProjects/BasicSelenium/test.py", line 17, in <module>
if item.parent.parent.find("p") == color:  AttributeError: 'WebDriver' object has no attribute 'parent'

2 个答案:

答案 0 :(得分:1)

对于这样的事情,我会写一个带有关键字和颜色名称的函数。您可以获取这些值并将它们插入到单个XPath中,然后单击返回的A标记。<​​/ p>

nan

你会称之为

def select_product(keyword, color)
    driver.find_element_by_xpath("//article//a[contains(., '" + keyword + "')]/../../p/a[contains(., '" + color + "')]").click()

一些快速的XPath信息

select_product("Geto Boys", "Ash Grey") 表示任何深度vs //,表示儿童(一级向下)

/表示查找包含文字“{some}”的a[contains(.,"some text")]标记。 A中的.contains()的快捷方式,只是表示元素中包含的文字。

text()意味着上升一级

因此,将它们放在一起,它会在任何级别找到/..标记,该标记具有包含具有父项的ARTICLE文本的后代(任何级别)A标记(两个级别),其中keyword个孩子的P子项包含A文字。

XPath本身就是一种编程语言。你最好阅读XPath指南。

旁注...我建议您赞成按此顺序查找元素:

  1. by ID
  2. by CSS selector
  3. ...然后,如果您无法通过这些方式找到它,那么您将回退到XPath以按包含的文本定位元素。 XPath较慢,不如CSS选择器支持。我在这种情况下使用它是因为你需要根据包含的文本找到一个元素,或者我会使用CSS选择器。

答案 1 :(得分:0)

这是一种方式:

from selenium import webdriver

browser = webdriver.Chrome()
browser.get(url)
anchors = browser.find_elements_by_class_name('name-link') 

这会让我们得到一个像这样的交替标签列表:

<h1><a class="name-link" href="/shop/blahblah">Very Cool Sweatshirt</a></h1>
<p><a class="name-link" href="/shop/blahblah">Red</a></p>  

我们可以将列表拆分成对并根据需要提取文本:

products = [anchors[i:i+n] for i in range(0, len(anchors), n)]                   
for item in products:
        element, description, color = item[0], item[0].text, item[1].text

或者我们可以使用父tag_name过滤事物:

products = []
for element in anchors:
    if element.find_element_by_xpath('..').tag_name == 'p':  # or 'h1'
        text = element.text
        products.append([element, text])