如何使用Selenium和Python遍历项目列表并提取特定部分

时间:2018-06-20 03:20:10

标签: python selenium

enter image description here从此网页“ https://meshb.nlm.nih.gov/treeView”开始,我要遍历树的每个节点,如果我在其项目中看到“心血管...”一词,我想创建字典,其中列出了顶级节点以及所有与心血管相关的项目。例如,在上一页中,您可以看到如果展开“解剖学[A]”,您将看到心血管。现在,如果您要扩展心血管功能,我希望它与心血管中包含的任何功能一起使用。我要遍历其某些元素的html页面的一部分如下:

<a class="ng-scope">
   <span class="ng-binding ng-scope">Anatomy [A]</span>
</a>
    <ul class="treeItem ng-scope">
        <li class ="ng-scope" >
              < a  class ="ng-scope" href="/record/ui?ui=D001829" >
              < span  class ="ng-binding ng-scope" > Body Regions[A01] < / span >
              </a>
        </li>
        < li class ="ng-scope" >
              <a  class ="ng-scope" href="/record/ui?ui=D001829" >
                < span  class ="ng-binding ng-scope" > Cardio Vascular< / span >
              </a>
                    <ul class="treeItem ng-scope">
                        <li class="ng-scope">
                           <a class="ng-scope" href="/record/ui?ui=D015824">
                           <span class="ng-binding ng-scope">Blood-Air Barrier [A07.025]</span>
                           </a>
                                 <ul class="treeItem ng-scope">                    
                                   <li class="ng-scope">
                                       <a class="ng-scope" href="/record/ui?ui=D018916">
                                       <span class="ng-binding ng-scope">Blood-Aqueous Barrier [A07.030]</span>                        
                                       </a>
                                    </li>
                                 </ul>
                        </li>
                    </ul>
        </li>
    </ul>

... 这是到目前为止我能够完成的!在Python中第一步,我想遍历顶级节点并找到“心血管..”一词,但我不断看到错误“没有这样的元素:无法找到元素”。有人可以告诉我我在这里想念什么吗?

from selenium import webdriver
chrome_path=r"G:\My Drive\A\chrome_driver\chromedriver_win32\chromedriver.exe"
driver=webdriver.Chrome(chrome_path)
driver.get('https://meshb.nlm.nih.gov/treeView')
for links in driver.find_elements_by_css_selector('a.ng-scope'):
    cardio = links.find_element_by_css_selector('li>a>span.ng-binding.ng-scope')        
    print(cardio.text)

1 个答案:

答案 0 :(得分:0)

您的代码中存在一些问题。除非单击父节点上的“ +”图标,否则无法迭代列表。

在您的代码中,我可以看到您创建了一个包含父节点(如解剖学,生物体等)的列表,但您没有编写代码来扩展该列表。

您必须遵循的步骤是:

  1. 将父节点存储在列表中=>此步骤已包含在代码中。
  2. 通过单击展开图标(+图标)=>需要覆盖,遍历每个父节点。
  3. 将子节点存储在列表中,并遍历子节点=>需要覆盖
  4. 除非您发现子节点“心血管” =>需要覆盖,否则请保持迭代。
  5. 单击子节点“心血管”前面的+图标,并将元素存储在字典中“心血管”节点下=>需要覆盖。

我已经为您创建了涵盖第1,第2和第3步的代码。请以相同的方式进行。

from selenium import webdriver
chrome_path=r"G:\MyDrive\A\chrome_driver\chromedriver_win32\chromedriver.exe"
driver=webdriver.Chrome(chrome_path)
driver.get('https://meshb.nlm.nih.gov/treeView')
for links in driver.find_elements_by_css_selector('a.ng-scope'):
    links.find_element_by_xpath("./following-sibling::span/i[1]").click();
      for sublinks in links.find_elements_by_xpath('./following-sibling::ul/li//a'):
        print(sublinks.text)

我有Java背景,请原谅我与语言相关的语法问题。