链接到完整源代码:
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'
答案 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指南。
旁注...我建议您赞成按此顺序查找元素:
...然后,如果您无法通过这些方式找到它,那么您将回退到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])