我正在准备一个网络报废脚本,该脚本应该通过商业目录网站查找某个区域的律师名单。我使用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 . . .
请让我知道我错过了什么。我已经检查过this和that,但无法理解。
非常欣赏它。
由于
答案 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