如何在Python Selenium中使用XPath访问节点的子节点?

时间:2016-09-14 22:15:25

标签: python selenium xpath web-scraping

我正在准备一个网络报废脚本,该脚本应该通过商业目录网站查找某个区域的律师名单。我使用chrome驱动程序填写搜索关键字和区域值。

由于某些点击没有电话号码,我想迭代搜索结果对应的DIV列表,然后检查它是否有作为盛大孩子的电话号码,如果是,那么我得到了电话号码,否则我将该字段留空。

根据以下代码,我提出了两种方法。

import time
import json as js
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

url = 'http://www.yellowpages.com/search?search_terms=Divorce+Attorneys&geo_location_terms=sun+diego'
RsultsList = []

driver = webdriver.Chrome()
driver.get(url)
ThereIsNext = True
while ThereIsNext:

    # find ads.
    nAddResults = len( driver.find_elements_by_xpath("//div[@class='result flash-ad']"))

    #print 'add size = %d' % nAddResults
    for i in range(nAddResults):
        phone1 = driver.find_elements_by_xpath("//div[@class='result flash-ad']/div[1]/div[1]/div[2]/div[1]/ul[1]/li[1]")[i].text
        BusinessName1 = driver.find_elements_by_xpath("//div[@class='result flash-ad']//a[@class='business-name']")[i].text

        elem = driver.find_elements_by_xpath("//div[@class='result flash-ad']")
        phone2 = elem.find_element_by_xpath("/div[1]/div[1]/div[2]/div[1]/ul[1]/li[1]")[i].text
        BusinessName2 = elem.find_element_by_xpath("//a[@class='business-name']")

第一个容易出错,因为没有电话号码的记录。不必在最后出现。所以我想出了第二种方式。但是,如果尝试第二个,我会收到以下错误消息。

Traceback (most recent call last):
  File "C:\Users\XXXX\documents\visual studio 2015\Projects\PythonApplication3\
PythonApplication3\AtorneyList.py", line 23, in <module>
    phone2 = elem.find_element_by_xpath("/div[1]/div[1]/div[2]/div[1]/ul[1]/li[1
]").text
AttributeError: 'list' object has no attribute 'find_element_by_xpath'
Press any key to continue . . .

请让我知道我错过了什么。我已经检查过thisthat,但无法理解。

非常欣赏它。

由于

1 个答案:

答案 0 :(得分:1)

实际上find_elements()会返回WebElement列表或空列表。您将此结果存储到列表变量名称elem

  

AttributeError:'list'对象没有属性'find_element_by_xpath'

之所以会出现这种情况,是因为您要在elem列表中找到嵌套的WebElement,这就是为什么您正在调用elem.find_element_by_xpath()这绝对是错误的。 < / p>

实际上,find_element()find_elements用于搜索页面上下文上的元素或WebElement上下文list

因此,您应该尝试从driver中查找WebElement列表表示页面上下文,然后使用此元素上下文迭代以查找更多嵌套WebElement,如下所示: -

elems = driver.find_elements_by_xpath("//div[@class='result flash-ad']")

for elem in elems:
    phone2 = elem.find_element_by_xpath(".//div[1]/div[1]/div[2]/div[1]/ul[1]/li[1]").text
    BusinessName2 = elem.find_element_by_xpath(".//a[@class='business-name']").text