簡體   English   中英

Web 用 selenium 和 python 刮擦 - Z3D788FA62D7C185A1BEE4C9147EE109Z 包含文本

[英]Web scraping with selenium and python - xpath with contains text

我會盡量讓它很短。 我正在嘗試單擊從網站搜索出來的產品。 基本上有一個匹配產品列表,我想單擊第一個包含我在其標題中搜索的產品名稱的產品。 我將發布該網站的鏈接,以便您檢查其 DOM 結構: https://www.tonercartuccestampanti.it/#/dfclassic/query=CE285A&query_name=match_and在這種情況下,許多包含我的查詢字符串,我只想單擊第一個。

這是我為此編寫的代碼片段:

def click_on_first_matching_product(self):
        first_product = WebDriverWait(self.driver, 6).until(
            EC.visibility_of_all_elements_located((By.XPATH, f"//a[@class='df-card__main']/div/div[@class=df-card__title] and contains(text(), '{self.product_code}')"))
        )[0]
        first_product.click()

問題是 6 秒 go by 並且它找不到滿足我寫的 xPath 條件的元素,但我不知道如何使它工作。 我正在嘗試獲取一個元素的搜索結果並檢查其結構中的標題是否包含我搜索的查詢字符串。 請問我可以提供一些幫助和解釋嗎? 我對 selenium 和 XPaths 很陌生...

我還可以提供一個可靠的 selenium 文檔的鏈接嗎? 我很難找到一個好的。 或許還可以解釋如何為 xPaths 創建條件。

您的 xpath 似乎不正確。嘗試按照 xpath 點擊產品。

driver.get("https://www.tonercartuccestampanti.it/#/dfclassic/query=CE285A&query_name=match_and")
def click_on_first_matching_product(product_code):
    first_product = WebDriverWait(driver, 6).until(EC.visibility_of_all_elements_located((By.XPATH,"//div[@class='df-card__title' and contains(text(), '{}')]".format(product_code))))[0]
    first_product.click()
click_on_first_matching_product("CE285A")

你需要考慮幾件事。 您的用例是單擊第一個搜索結果或單擊與卡片標題相關的項目。 如果單擊一個明確的WebElement導致WebDriverWait for visibility_of_all_elements_located()太昂貴


要單擊與卡片標題相關的項目,您必須為element_to_be_clickable()誘導WebDriverWait ,您可以使用以下基於定位器策略

  • 直接使用文本CE285A Toner Compatibile Per Hp LaserJet P1102

     driver.get('https://www.tonercartuccestampanti.it/#/dfclassic/query=CE285A&query_name=match_and') WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[text()='CE285A Toner Compatibile Per Hp LaserJet P1102']"))).click()
  • 通過format()使用文本變量:

     driver.get('https://www.tonercartuccestampanti.it/#/dfclassic/query=CE285A&query_name=match_and') text = "CE285A Toner Compatibile Per Hp LaserJet P1102" WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[text()='{}']".format(text)))).click()
  • 通過%s為文本使用變量:

     driver.get('https://www.tonercartuccestampanti.it/#/dfclassic/query=CE285A&query_name=match_and') text = "CE285A Toner Compatibile Per Hp LaserJet P1102" WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[text()='%s']"% str(text)))).click()

要單擊第一個搜索產品,您必須為element_to_be_clickable()誘導WebDriverWait ,您可以使用以下任一定位器策略

  • CSS_SELECTOR

     driver.get('https://www.tonercartuccestampanti.it/#/dfclassic/query=CE285A&query_name=match_and') WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div.df-card>a"))).click()
  • XPATH

     driver.get('https://www.tonercartuccestampanti.it/#/dfclassic/query=CE285A&query_name=match_and') WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[@class='df-card']/a"))).click()

注意:您必須添加以下導入:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

Python Selenium,檢查是否<div ...>包含網頁抓取代碼中的單詞</div><div id="text_translate"><p>我正在使用 Selenium 和 BeautifulSoup 運行刮板,我想檢查某個單詞是否在 &lt;div...&gt; 中。</p><p> HTML 代碼片段如下:</p><pre> &lt;div data-asin="0974158232" data-index="0" data-uuid="1f362f6b-dde2-4377-a5f3-518513486b7d" data-component-type="s-search-result" class="s-result-item s-asin sg-col-0-of-12 sg-col-16-of-20 sg-col sg-col-12-of-16" data-component-id="14" data-cel-widget="search_result_0"&gt;&lt;div class="sg-col-inner"&gt; &lt;div data-asin="" data-index="1" class="a-section a-spacing-none s-result-item s-flex-full-width s-border-bottom-none s-widget" data-cel-widget="search_result_1"&gt; &lt;div data-asin="" data-index="2" class="a-section a-spacing-none s-result-item s-flex-full-width s-border-bottom-none s-widget" data-cel-widget="search_result_2"&gt;</pre><p> 首先,我想檢查div data-asin=""是否為空,或者是否有一個字符串,如data-asin="0974158232" 。</p><p> 如果它是空的,我想輸入 &lt;div...&gt; 並查找data-asin 。 div data-asin="" data-index="2"的一個例子是:</p><pre> &gt; &lt;div data-asin="" data-index="2" class="a-section a-spacing-none s-result-item s-flex-full-width s-border-bottom-none s-widget" data-cel-widget="search_result_2"&gt; &gt; &lt;span cel_widget_id="MAIN-SEARCH_RESULTS-2" class="celwidget slot=MAIN template=SEARCH_RESULTS widgetId=fkmr-search-results" data-csa-c-id="9so6vg-imque6-h59746-o5az71" data-cel-widget="MAIN- SEARCH_RESULTS-2"&gt; &gt; &lt;div class="s-result-list sg-row"&gt; &gt; &lt;div class="s-result-item sg-col-16-of-20 sg-col sg-col-8-of-12 sg-col-12-of-16" data-cel- widget="search_result_3"&gt; &gt; &lt;div data-asin="0974158216" data-index="0" data-uuid="99a1b582-2fcb-49b8-8d13-739783e460a5" data-component-type="s-search-result" class="s-result-item s-asin sg-col-0-of-12 sg-col-16- of-20 sg-col sg-col-12-of-16" data-component-id="15" data-cel-widget="search_result_4"&gt;&lt;div class="sg-col-inner"&gt; &gt; &lt;div data-asin="1433692163" data-index="1" data-uuid="8f8bfb8c-6083-4c26-bdd5-3032bcfe4bed" data-component-type="s-search-result" class="s-result-item s-asin sg-col-0-of-12 sg-col-16- of-20 sg-col sg-col-12-of-16" data-component-id="16" data-cel-widget="search_result_5"&gt;</pre><p> 在這里,我想告訴代碼查找data-asin=""並檢查它是否為空字符串。 在這種情況下,它不會為空,因為我們有: &lt;div data-asin="0974158216"和&lt;div data-asin="1433692163"</p><p> 我正在考慮使用 for 循環或 try/except,但我對 Selenium 和 HTML 非常陌生,我不知道如何解決這個問題。 任何形式的幫助將不勝感激。</p></div>

[英]Python Selenium, check if <div ...> contains a word in web-scraping code

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

相關問題 Web 用 Selenium 和 Xpath 刮 Xpath Python網頁抓取 使用python和硒的Web抓取eBay下拉文本 Python Selenium Web Scraping - 隱藏文本/Javascript? Web 抓取到 excel,文本未對齊(selenium,python) 通過Selenium + XPath在Morningstar.com上進行Python Web抓取 How to access the iframe by XPath for Web scraping using Selenium with Python 使用 Selenium 和 Python 從 xpath 不斷變化的元素中抓取文本 Python Selenium,檢查是否<div ...>包含網頁抓取代碼中的單詞</div><div id="text_translate"><p>我正在使用 Selenium 和 BeautifulSoup 運行刮板,我想檢查某個單詞是否在 &lt;div...&gt; 中。</p><p> HTML 代碼片段如下:</p><pre> &lt;div data-asin="0974158232" data-index="0" data-uuid="1f362f6b-dde2-4377-a5f3-518513486b7d" data-component-type="s-search-result" class="s-result-item s-asin sg-col-0-of-12 sg-col-16-of-20 sg-col sg-col-12-of-16" data-component-id="14" data-cel-widget="search_result_0"&gt;&lt;div class="sg-col-inner"&gt; &lt;div data-asin="" data-index="1" class="a-section a-spacing-none s-result-item s-flex-full-width s-border-bottom-none s-widget" data-cel-widget="search_result_1"&gt; &lt;div data-asin="" data-index="2" class="a-section a-spacing-none s-result-item s-flex-full-width s-border-bottom-none s-widget" data-cel-widget="search_result_2"&gt;</pre><p> 首先,我想檢查div data-asin=""是否為空,或者是否有一個字符串,如data-asin="0974158232" 。</p><p> 如果它是空的,我想輸入 &lt;div...&gt; 並查找data-asin 。 div data-asin="" data-index="2"的一個例子是:</p><pre> &gt; &lt;div data-asin="" data-index="2" class="a-section a-spacing-none s-result-item s-flex-full-width s-border-bottom-none s-widget" data-cel-widget="search_result_2"&gt; &gt; &lt;span cel_widget_id="MAIN-SEARCH_RESULTS-2" class="celwidget slot=MAIN template=SEARCH_RESULTS widgetId=fkmr-search-results" data-csa-c-id="9so6vg-imque6-h59746-o5az71" data-cel-widget="MAIN- SEARCH_RESULTS-2"&gt; &gt; &lt;div class="s-result-list sg-row"&gt; &gt; &lt;div class="s-result-item sg-col-16-of-20 sg-col sg-col-8-of-12 sg-col-12-of-16" data-cel- widget="search_result_3"&gt; &gt; &lt;div data-asin="0974158216" data-index="0" data-uuid="99a1b582-2fcb-49b8-8d13-739783e460a5" data-component-type="s-search-result" class="s-result-item s-asin sg-col-0-of-12 sg-col-16- of-20 sg-col sg-col-12-of-16" data-component-id="15" data-cel-widget="search_result_4"&gt;&lt;div class="sg-col-inner"&gt; &gt; &lt;div data-asin="1433692163" data-index="1" data-uuid="8f8bfb8c-6083-4c26-bdd5-3032bcfe4bed" data-component-type="s-search-result" class="s-result-item s-asin sg-col-0-of-12 sg-col-16- of-20 sg-col sg-col-12-of-16" data-component-id="16" data-cel-widget="search_result_5"&gt;</pre><p> 在這里,我想告訴代碼查找data-asin=""並檢查它是否為空字符串。 在這種情況下,它不會為空,因為我們有: &lt;div data-asin="0974158216"和&lt;div data-asin="1433692163"</p><p> 我正在考慮使用 for 循環或 try/except,但我對 Selenium 和 HTML 非常陌生,我不知道如何解決這個問題。 任何形式的幫助將不勝感激。</p></div> 使用 python 和 selenium 進行網頁抓取
 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM