【发布时间】:2019-02-20 01:40:09
【问题描述】:
我正在尝试从该链接https://www.hopkinsguides.com/hopkins/index/Johns_Hopkins_ABX_Guide/Antibiotics 抓取信息
本站使用jquery。我的目标是刮掉所有的抗生素名称,然后为每个抗生素刮掉“非 FDA 批准的用途”,它包含在一个单独的链接中。我希望我说得通。
抗生素属于包含许多其他子类别的类别,这些子类别包含其余抗生素及其各自的链接。
我的程序第一次登录,点击前7个按钮展开并显示更多类别。我使用driver.find_element_by_x_path 扩展第一层,但我不能以相同的方式扩展第二层(通过循环通过 x_path),因为如果我这样做,最终会将我带到“非 FDA 批准使用”信息的另一个页面被包含而不是扩展页面。
这样做是因为一旦您展开第一层,那么第二层现在包含更多按钮/子类别和链接,可将您带到“非 FDA 批准使用”的页面。
所以如果这些是我的 x_paths
#//*[@id="firstul"]/li[1]/a
#//*[@id="firstul"]/li[2]/a
li[1] 可能是一个重定向链接, li[2] 可以是一个显示更多链接的按钮(这是我首先想要的)
我做了一个汤来将按钮与链接分开,但现在我无法点击我在底部 for 循环中打印的“a”标签。
关于我应该如何处理的任何想法?提前致谢。
这是我的代码。
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
from random import randint
from bs4 import BeautifulSoup
#SIGN-IN
driver = webdriver.Chrome()
driver.get("http://www.hopkinsguide.com/home")
url = "https://www.hopkinsguides.com/hopkins/index/"
assert "Hopkins" in driver.title
sign_in_button = driver.find_element_by_xpath('//*[@id="logout"]')
sign_in_button.click()
user_elem = driver.find_element_by_name('username')
pass_elem = driver.find_element_by_id('dd-password')
user_elem.send_keys("user")
time.sleep(2)
pass_elem.send_keys("pass")
time.sleep(2)
sign_in_after_input = driver.find_element_by_xpath('//*[@id="dd-login-button"]')
sign_in_after_input.click()
def expand_page():
req = driver.get("https://www.hopkinsguides.com/hopkins/index/Johns_Hopkins_ABX_Guide/Antibiotics")
time.sleep(randint(2, 4))
#expand first layer
for i in range(1, 8):
driver.find_element_by_xpath("//*[@id='firstul']/li[" + str(i) + "]/a").click()
time.sleep(2)
html = driver.page_source
soup = BeautifulSoup(html, features='lxml')
for i in soup.find_all('a'):
if i.get('data-path') != None:
print(i)
time.sleep(2)
expand_page()
【问题讨论】:
标签: python selenium selenium-webdriver web-scraping