通过Python、Selenium和Beautiful Soup扩展DOM列表以提取其他内容

2024-05-19 05:07:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我想从a page中提取内容,这需要选择一个列表节点。我已经使用python和Selenium检索了html页面。通过将页面源代码传递给BS4,我可以解析出我要使用的内容

   open_li = soup.select('div#tree ul.jstree-container-ul li')

返回的每个列表项都有一个

      aria-expanded = "false"  and class="jstree-node jstree-closed"

查看inspect元素,当这些变量设置为

   aria-expanded = "true"  and class="jstree-node jstree-open"

我试过在内容上使用.click方法

  driver.find_element_by_id('tree').click()

但这只会改变页面上的其他内容。我认为在发出请求时,必须扩展列表节点本身。你知道吗

有人知道如何在返回内容之前更改页面上的元素吗?你知道吗

谢谢


Tags: andnodetree元素内容列表节点jstree
2条回答

没有得到输出可能有多种原因

a)您单击了错误的元素

b)在单击元素之前,您不会等待它被加载

c)您不是在等待单击元素后加载内容

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome('/path/to/chromedriver')
url="https://app.updateimpact.com/treeof/org.apache.commons/commons-lang3/3.7"
driver.get(url)
element=WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH ,'//*[@id="org.apache.commons:commons-lang3:3.7:jar_anchor"]/span')))
element.click()
element=WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH ,'//*[@id="tree-detail"]/div[2]/span[1]')))
print(driver.find_element_by_xpath('//*[@id="detail_div"]').text)

输出

org.apache.commons:commons-lang3:3.7:jar (back)
Project module (browse only dependencies of this module)
Group id org.apache.commons
Artifact id commons-lang3
Version 3.7
Type jar
This dependency isn't a dependency of any other dependencies.

您可以使用requests包以json的形式获取所有信息。 下面是如何从page获取所有信息的示例:

import requests

if __name__ == '__main__':
    url = "https://app.updateimpact.com/api/singleArtifact?artifactId=commons-lang3&groupId=org.apache.commons&version=3.7"

    req_params = requests.get(url).json()
    response = requests.get(
        'https://app.updateimpact.com/api/builds/%s/%s' % (req_params["userIdStr"], req_params["buildId"]))
    print(response.json())

相关问题 更多 >

    热门问题