如何使用 PhantomJS 和 Selenium 浏览页面
How to browse over a page using PhantomJS and Selenium
我在网页上得到了一些 DIV 元素。总共有 30 个 DIV 个具有以下类似结构的块:
<div class="w-dyn-item">
<a href="/project/soft" class="jobs-wrapper no-line w-inline-block w-clearfix">
<div class="jobs-client">
<img data-qazy="true" src="https://global.com/test.jpg" alt="Soft" class="image-9">
<div style="background-color:#cd7f32" class="job-time">Level 1</div>
</div>
<div class="jobs-content w-clearfix">
<div class="w-clearfix">
<div class="text-block-19 w-condition-invisible">PROMO</div>
<h3 class="job-title">Soft</h3>
<img height="30" data-qazy="true" src="https://global.com/test.jpg" alt="Soft" class="image-15 w-hidden-main w-hidden-medium w-hidden-small"></div>
<div class="div-block w-clearfix">
<div class="text-block-4">Italy</div>
<div class="text-block-4 w-hidden-small w-hidden-tiny">AMB</div>
<div class="text-block-4 w-hidden-small w-hidden-tiny">GTL</div>
<div class="text-block-13">January 10, 2017</div><div class="text-block-14">End date:</div></div><div class="space small"></div><p class="paragraph-3">Text text text</p></div>
</a>
</div>
我正在尝试访问 a href
并单击 link。但是,问题是我不能使用 find_element_by_link_text
,因为 link 文本不存在。是否可以通过classclass="jobs-wrapper no-line w-inline-block w-clearfix"
访问a href
?当我使用 find_element_by_class_name
时,出现错误 Message: {"errorMessage":"Compound class names not permitted","request
from selenium import webdriver
driver = webdriver.PhantomJS()
driver.set_window_size(1120, 550)
driver.get("https://myurl.com/")
driver.find_element_by_link_text("//a href").click()
print driver.current_url
driver.quit()
如果您唯一的要求是单击带有 w-dyn-item
class 的标签内的 a
标签,那么您可以这样做:
driver.find_element_by_class_name("w-dyn-item").find_element_by_tag_name("a").click()
要使用 w-dyn-item
class 遍历所有标签 -> 单击其中的 a
-> 做点什么 -> 返回,执行此操作:
tags = driver.find_elements_by_class_name("w-dyn-item")
for i in range(len(tags)):
tag = driver.find_elements_by_class_name("w-dyn-item")[i]
tag.find_element_by_tag_name("a").click()
# Do what you want inside the page...
driver.back()
这里的关键当然是在完成内页后回到根页面。
您遇到的错误是因为 Selenium 的 find_element_by_class_name
不支持多个 classes。
使用 CSS select 或 find_elements_by_css_selector
代替:
driver.find_elements_by_css_selector('.jobs-wrapper.no-line.w-inline-block.w-clearfix')
将 select 所有带有您想要的 class 的标签,然后您可以遍历它们并使用 click()
或任何其他想要的操作
编辑
根据您的评论,新代码段可帮助您做您想做的事:
result = {}
urls = []
# 'elements' is a the list you previously obtained using the css selector
for element in elements:
urls.append(element.get_attribute('href'))
# Now you can iterate over all extracted hrefs:
for url in urls:
url_data = {}
driver.get(url)
field1 = driver.find_element_by_id('wanted_id_1')
url_data['field1'] = field1
field2 = driver.find_element_by_id('wanted_id_2')
url_data['field2'] = field2
result[url] = url_data
现在,result
是一个结构类似于您想要的字典。
请注意 field1
和 field2
属于 WebElement
类型,因此您可能需要先对它们进行一些操作(提取属性、文本等)。
此外,就我个人而言,请查看 requests together with BeautifulSoup,它们可能比 Selenium
更适合当前或未来的类似案例。
要访问并单击 a href
,您可以使用以下代码行:
driver.find_element_by_xpath("//div[@class='w-dyn-item']/a[@href='/project/soft']").click()
我在网页上得到了一些 DIV 元素。总共有 30 个 DIV 个具有以下类似结构的块:
<div class="w-dyn-item">
<a href="/project/soft" class="jobs-wrapper no-line w-inline-block w-clearfix">
<div class="jobs-client">
<img data-qazy="true" src="https://global.com/test.jpg" alt="Soft" class="image-9">
<div style="background-color:#cd7f32" class="job-time">Level 1</div>
</div>
<div class="jobs-content w-clearfix">
<div class="w-clearfix">
<div class="text-block-19 w-condition-invisible">PROMO</div>
<h3 class="job-title">Soft</h3>
<img height="30" data-qazy="true" src="https://global.com/test.jpg" alt="Soft" class="image-15 w-hidden-main w-hidden-medium w-hidden-small"></div>
<div class="div-block w-clearfix">
<div class="text-block-4">Italy</div>
<div class="text-block-4 w-hidden-small w-hidden-tiny">AMB</div>
<div class="text-block-4 w-hidden-small w-hidden-tiny">GTL</div>
<div class="text-block-13">January 10, 2017</div><div class="text-block-14">End date:</div></div><div class="space small"></div><p class="paragraph-3">Text text text</p></div>
</a>
</div>
我正在尝试访问 a href
并单击 link。但是,问题是我不能使用 find_element_by_link_text
,因为 link 文本不存在。是否可以通过classclass="jobs-wrapper no-line w-inline-block w-clearfix"
访问a href
?当我使用 find_element_by_class_name
时,出现错误 Message: {"errorMessage":"Compound class names not permitted","request
from selenium import webdriver
driver = webdriver.PhantomJS()
driver.set_window_size(1120, 550)
driver.get("https://myurl.com/")
driver.find_element_by_link_text("//a href").click()
print driver.current_url
driver.quit()
如果您唯一的要求是单击带有 w-dyn-item
class 的标签内的 a
标签,那么您可以这样做:
driver.find_element_by_class_name("w-dyn-item").find_element_by_tag_name("a").click()
要使用 w-dyn-item
class 遍历所有标签 -> 单击其中的 a
-> 做点什么 -> 返回,执行此操作:
tags = driver.find_elements_by_class_name("w-dyn-item")
for i in range(len(tags)):
tag = driver.find_elements_by_class_name("w-dyn-item")[i]
tag.find_element_by_tag_name("a").click()
# Do what you want inside the page...
driver.back()
这里的关键当然是在完成内页后回到根页面。
您遇到的错误是因为 Selenium 的 find_element_by_class_name
不支持多个 classes。
使用 CSS select 或 find_elements_by_css_selector
代替:
driver.find_elements_by_css_selector('.jobs-wrapper.no-line.w-inline-block.w-clearfix')
将 select 所有带有您想要的 class 的标签,然后您可以遍历它们并使用 click()
或任何其他想要的操作
编辑
根据您的评论,新代码段可帮助您做您想做的事:
result = {}
urls = []
# 'elements' is a the list you previously obtained using the css selector
for element in elements:
urls.append(element.get_attribute('href'))
# Now you can iterate over all extracted hrefs:
for url in urls:
url_data = {}
driver.get(url)
field1 = driver.find_element_by_id('wanted_id_1')
url_data['field1'] = field1
field2 = driver.find_element_by_id('wanted_id_2')
url_data['field2'] = field2
result[url] = url_data
现在,result
是一个结构类似于您想要的字典。
请注意 field1
和 field2
属于 WebElement
类型,因此您可能需要先对它们进行一些操作(提取属性、文本等)。
此外,就我个人而言,请查看 requests together with BeautifulSoup,它们可能比 Selenium
更适合当前或未来的类似案例。
要访问并单击 a href
,您可以使用以下代码行:
driver.find_element_by_xpath("//div[@class='w-dyn-item']/a[@href='/project/soft']").click()