【问题标题】:Loop through the div tag containing paragraph tags循环遍历包含段落标签的 div 标签
【发布时间】:2021-09-13 03:34:21
【问题描述】:

我正在尝试从汽车博客中抓取信息,但我无法遍历包含包含该信息的段落标签的 div 标签。

driver.get("https://www.autocar.co.uk/car-news")
driver.maximize_window()

for i in range(3):
    i+=1
    info = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.XPATH, f'//*[@id="page"]/div[2]/div[1]/div[1]/div[2]/div/div[1]/div/div[1]/div[1]/div[{i}]/div')))

heading = info.find_element_by_tag_name('h2')
clickable = heading.find_element_by_tag_name('a')
driver.execute_script("arguments[0].click();", clickable)
# the code starts to fail around here
try:
    body_info =  WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.CLASS_NAME, 'field-item even')))
        
    main_text = []
    for j in range(3):
        j+=1
        text = body_info.find_element_by_tag_name('p')
        main_text.append(text)
        for t in main_text:
            t_info = t.text
    print(f'{heading.text}\n{t_info}')
except:
    print("couldn't find tag")

driver.back()

【问题讨论】:

    标签: python selenium selenium-webdriver web-scraping


    【解决方案1】:

    您的代码有问题,(By.CLASS_NAME, 'field-item even')

    Selenium 不支持带空格的multiple classesclasses

    只需将replace 空格与. 结合起来,即为CSS_SELECTOR

    试试这样的:

    try:
        body_info =  WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.CSS_SELECTOR, '.field-item.even')))
    

    【讨论】:

      【解决方案2】:

      如果您将By.CSS_SELECTOR 用于presence_of_element_located(),则它必须是'.field-item even' 而不是'field-item even'

      所以替换,

      body_info =  WebDriverWait(driver, 10).until(
              EC.presence_of_element_located((By.CLASS_NAME, 'field-item even')))
      

      与,

      body_info =  WebDriverWait(driver, 10).until(
              EC.presence_of_element_located((By.CLASS_NAME, 'field-item even')))
      

      官方文档。 https://selenium-python.readthedocs.io/api.html#locate-elements-by

      【讨论】:

        【解决方案3】:

        要选择多个类,您必须使用类选择器。您不能像在 CSS 中那样通过空格选择多个类。您需要使用类选择器选择多个类。所以你必须在所有的类前面加上一个点,并且它们之间不能有任何空格

        【讨论】:

        • 对,但你能解释一下吗?
        • 看,你不能像css那样通过空格选择多个类。您需要使用类选择器选择类。所以你必须在所有类的前面加上一个点,并且它们之间不能有任何空格
        • 你为什么不编辑你的答案并添加这个解释。
        猜你喜欢
        • 2018-10-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-14
        相关资源
        最近更新 更多