【问题标题】:How to access the specific elements using Python Selenium?如何使用 Python Selenium 访问特定元素?
【发布时间】:2022-01-03 19:55:15
【问题描述】:

我有一个简单的 selenium python 应用程序,我正在尝试通过网络抓取类别,即链接。我遇到的问题是使用 xpath 将左窗格上的链接作为列表通过。此外,我想捕获线类:消化道和代谢/id:A/类类型:ATC1-4/显示上下文,但我不知道从哪里开始,因为它不显示在html 或 chrome 开发工具。

我正在从以下网站提取数据:

https://mor.nlm.nih.gov/RxClass/search?query=ALIMENTARY%20TRACT%20AND%20METABOLISM%7CATC1-4&searchBy=class&sourceIds=a&drugSources=atc1-4%7Catc%2Cepc%7Cdailymed%2Cmeshpa%7Cmesh%2Cdisease%7Cmedrt%2Cchem%7Cdailymed%2Cmoa%7Cdailymed%2Cpe%7Cdailymed%2Cpk%7Cmedrt%2Ctc%7Cfmtsme%2Cva%7Cva%2Cdispos%7Csnomedct%2Cstruct%7Csnomedct%2Cschedule%7Crxnorm

我当前的代码是未注释的有效代码:

from selenium import webdriver
import pandas as pd
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.common.proxy import Proxy, ProxyType
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time

#service = Service('C:\Program Files\Chrome Driver\chromedriver.exe')
URL = "https://mor.nlm.nih.gov/RxClass/search?query=ALIMENTARY%20TRACT%20AND%20METABOLISM%7CATC1-4&searchBy=class&sourceIds=a&drugSources=atc1-4%7Catc%2Cepc%7Cdailymed%2Cmeshpa%7Cmesh%2Cdisease%7Cmedrt%2Cchem%7Cdailymed%2Cmoa%7Cdailymed%2Cpe%7Cdailymed%2Cpk%7Cmedrt%2Ctc%7Cfmtsme%2Cva%7Cva%2Cdispos%7Csnomedct%2Cstruct%7Csnomedct%2Cschedule%7Crxnorm"
driver = webdriver.Chrome('C:\Program Files\Chrome Driver\chromedriver.exe')
driver.get(URL)


category = driver.find_elements_by_class_name(By.XPATH, "//div[@class='service drug_class']//a")
print(category)


#WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, 'tr.dbsearch')))
#pd.read_html(driver.page_source)[1].iloc[:,:-1].to_csv('table.csv',index=False)
#time.sleep(8)
#driver.quit()

此外,我一直在尝试获取页面上显示为的内容:

class: ALIMENTARY TRACT AND METABOLISM / id: A / class type: ATC1-4 / show context

如何访问该文本?我尝试的所有内容都没有给出这样的元素或没有这样的类名作为错误。主要问题是我不确定如何在 javascript 中找到这些元素或类的名称,如果它不存在于 HTML 或 chrome 开发工具中的元素中?

我正在使用以下内容的错误消息是:

category = driver.find_elements_by_class_name(By.XPATH, "//div[@class='service drug_class']//a")
print(category)

TypeError: find_elements_by_class_name() takes 2 positional arguments but 3 were given

【问题讨论】:

  • 您想获取哪些详细信息?另外,我在您的代码中看不到任何尝试获取这些详细信息或左侧带有硒的强文本...
  • 在整个编辑过程中尝试多次更改。根据下面的答案,这使我进入了正确的区域,但仍然在尝试在页面的元素或类上找到此行时遇到问题。班级:消化道和新陈代谢 / id:A / 班级类型:ATC1-4 / 显示上下文
  • 如果您仍然对答案有疑问,那么您不应该将其标记为答案。如果有一个接受的答案,那么大多数用户不会尝试改进它,并且这个问题/答案仅作为其他人的目的,以防他们遇到同样的问题....
  • 第一部分的答案是正确的,这应该作为两个不同的问题提出。我的道歉。
  • 你不必道歉,我只是在暗示你可能不会得到回应...... ???? (关于问题的附加部分)

标签: python selenium web-scraping css-selectors webdriverwait


【解决方案1】:

要为页面左侧的链接打印强文本名称,您必须将WebDriverWait 诱导为visibility_of_all_elements_located(),您可以使用以下任一Locator Strategies:

  • 使用CSS_SELECTOR:

    driver.get("https://mor.nlm.nih.gov/RxClass/search?query=ALIMENTARY%20TRACT%20AND%20METABOLISM%7CATC1-4&searchBy=class&sourceIds=a&drugSources=atc1-4%7Catc%2Cepc%7Cdailymed%2Cmeshpa%7Cmesh%2Cdisease%7Cmedrt%2Cchem%7Cdailymed%2Cmoa%7Cdailymed%2Cpe%7Cdailymed%2Cpk%7Cmedrt%2Ctc%7Cfmtsme%2Cva%7Cva%2Cdispos%7Csnomedct%2Cstruct%7Csnomedct%2Cschedule%7Crxnorm")
    print([my_elem.text for my_elem in WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "div.drug_class img +a")))])
    
  • 控制台输出:

    ['Anatomical Therapeutic Chemical (ATC1-4)', 'ALIMENTARY TRACT AND METABOLISM (397)', 'ANABOLIC AGENTS FOR SYSTEMIC USE (9)', 'ANTIDIARRHEALS, INTESTINAL ANTIINFLAMMATORY/ANTIINFECTIVE AGENTS (44)', 'ANTIEMETICS AND ANTINAUSEANTS (13)', 'ANTIOBESITY PREPARATIONS, EXCL. DIET PRODUCTS (12)', 'BILE AND LIVER THERAPY (13)', 'DIGESTIVES, INCL. ENZYMES (7)', 'DRUGS FOR ACID RELATED DISORDERS (35)', 'DRUGS FOR CONSTIPATION (39)', 'DRUGS FOR FUNCTIONAL GASTROINTESTINAL DISORDERS (47)', 'DRUGS USED IN DIABETES (69)', 'MINERAL SUPPLEMENTS (30)', 'OTHER ALIMENTARY TRACT AND METABOLISM PRODUCTS (41)', 'STOMATOLOGICAL PREPARATIONS (31)', 'TONICS (0)', 'VITAMINS (23)', 'BLOOD AND BLOOD FORMING ORGANS (158)', 'CARDIOVASCULAR SYSTEM (326)', 'DERMATOLOGICALS (242)', 'GENITO URINARY SYSTEM AND SEX HORMONES (160)', 'SYSTEMIC HORMONAL PREPARATIONS, EXCL. SEX HORMONES AND INSULINS (66)', 'ANTIINFECTIVES FOR SYSTEMIC USE (334)', 'ANTINEOPLASTIC AND IMMUNOMODULATING AGENTS (324)', 'MUSCULO-SKELETAL SYSTEM (130)', 'NERVOUS SYSTEM (433)', 'ANTIPARASITIC PRODUCTS, INSECTICIDES AND REPELLENTS (77)', 'RESPIRATORY SYSTEM (213)', 'SENSORY ORGANS (174)', 'VARIOUS (137)', 'Established Pharmacologic Classes (EPC) [from DailyMed]', 'MeSH Pharmacologic Actions (MESHPA)', 'Diseases, Life Phases, Behavior Mechanisms and Physiologic States', 'Substances and Cells (CHEM) [from DailyMed]', 'Mechanism of Action (MoA) [from DailyMed]', 'Physiologic Effect (PE) [from DailyMed]', 'Pharmacokinetics (PK)', 'VA Classes (VA)', 'Therapeutic Categories (TC)', 'Disposition (DISPOS) [from SNOMEDCT]', 'Structure (STRUCT) [from SNOMEDCT]', 'CSA Schedule (SCHEDULE)']
    
  • 注意:您必须添加以下导入:

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

【讨论】:

  • 这正是我所缺少的。我更新了问题以提供更清晰的信息。最后一部分是页面上的这一行:class: ALIMENTARY TRACT AND METABOLISM / id: A / class type: ATC1-4 / show context 如何访问整个文本?
【解决方案2】:

您似乎正在寻找强标签,而左侧的所有链接都是元素。这意味着您不会发现他们很强大。

基本上你正在寻找这个 xpath 来获取任何链接:

//div[@class='service drug_class']//a[text()='Any link text here']

将此处的任何链接文本替换为确切的链接文本。

【讨论】:

  • 如果我想获取左侧的整个名称列表而不是特定链接,我该怎么做?至于访问这个元素?类:消化道和代谢/id:A/类类型:ATC1-4/显示上下文。还有,你是怎么找到类名服务drug_class的?
  • 您可以通过以下方式获取所有链接://div[@class='service drug_class']//a - 另外,我如何找到类名 service drug_class 是通过查找包含所有内容的 div链接
  • 好的,谢谢!你让我走上正轨。如果类名或元素不在 div 标签中,而是隐藏在 javascript 中,例如页面上的一行:class: ALIMENTARY TRACT AND METABOLISM / id: A / class type: ATC1-4 / show context跨度>
猜你喜欢
  • 2022-11-16
  • 2011-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-26
  • 2021-03-31
相关资源
最近更新 更多