如何使用selenium而不实际打开浏览器并获取表内容?python

如何使用selenium而不实际打开浏览器并获取表内容?python,python,selenium,browser,Python,Selenium,Browser,我正在尝试在web数据库中运行python程序以获得结果表。我的问题是,如何在不打开浏览器的情况下获得结果?有没有更简单的方法来获得表格结果?我想得到下表的值(例如BCS等级、溶解度、剂量等)。(结果的底部没有td.text,因此我无法使用find next sibling命令。)谢谢!这是我的密码: from selenium import webdriver from selenium.webdriver.common.keys import Keys from bs4 import Bea

我正在尝试在web数据库中运行python程序以获得结果表。我的问题是,如何在不打开浏览器的情况下获得结果?有没有更简单的方法来获得表格结果?我想得到下表的值(例如BCS等级、溶解度、剂量等)。(结果的底部没有td.text,因此我无法使用find next sibling命令。)谢谢!这是我的密码:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from bs4 import BeautifulSoup

driver= webdriver.Chrome()
driver.get('http://www.ddfint.net/search.cfm')
search_form=driver.find_element_by_name('compoundName')
search_form.send_keys('Abacavir')
search_form.submit()

page= BeautifulSoup(driver.page_source, 'html.parser')
page.find("td", text="Lowest Solubility (mg/ml):").find_next_sibling("td").text

您可以尝试将
--headless
参数添加到
ChromeOptions
以告知浏览器不要渲染

from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_argument("--headless")
driver = webdriver.Chrome(chrome_options=chrome_options)

您可以通过添加如下选项使selenium无头:

from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument("--headless")
driver = webdriver.Chrome(chrome_options=chrome_options)
关于表中的迭代,您可以选择所有表行,并只选择如下所示的相关行:

from selenium.webdriver.common.by import By
rows = table_id.find_elements(By.TAG_NAME, "tr")
myrow = rows[5]
您可以使用模块。获取BCS类(logP)文本时出现问题,因为HTML在BCS类表数据中都被破坏。解决方案是使用
html5lib
作为解析器

import requests
from bs4 import BeautifulSoup
import re

headers = {
    'Connection': 'keep-alive',
    'Pragma': 'no-cache',
    'Cache-Control': 'no-cache',
    'Origin': 'http://www.ddfint.net',
    'Upgrade-Insecure-Requests': '1',
    'DNT': '1',
    'Content-Type': 'application/x-www-form-urlencoded',
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) '
                  'Chrome/77.0.3865.90 Safari/537.36',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,'
              'application/signed-exchange;v=b3',
    'Referer': 'http://www.ddfint.net/search.cfm',
    'Accept-Encoding': 'gzip, deflate',
    'Accept-Language': 'ru,en-US;q=0.9,en;q=0.8,tr;q=0.7',
}

data = {
    'compoundName': 'Abacavir',
    'category': '',
    'subcategory': '',
    'Submit': 'Search'
}

response = requests.post('http://www.ddfint.net/results.cfm', headers=headers, data=data, verify=False)
page = BeautifulSoup(response.text, 'html5lib')
print(page.find("td", text="Lowest Solubility (mg/ml):").find_next_sibling("td").text)

# get header row
header_row = page.find("td", text="Country List:").find_parent("tr")
# get columns names, remove : and *
header_data = [re.sub("[:*]", "", td.text.strip()) for td in header_row.find_all("td")]

country_index = header_data.index("Country List")
solubility_index = header_data.index("Solubility")
bcs_class_clogp_index = header_data.index("BCS Class (cLogP)")
bcs_class_logp_index = header_data.index("BCS Class (logP)")

row = header_row
while True:
    # check if next row exist
    row = row.find_next_sibling("tr")
    if not row:
        break

    # collect row data
    row_data = [td.text.strip() for td in row.find_all("td")]
    print(row_data[country_index], row_data[solubility_index],
          row_data[bcs_class_clogp_index], row_data[bcs_class_logp_index])

代码为:


您对获取表格结果也有意见吗?谢谢要从您的示例中获取表中“最低溶解度”的值,我只需使用纯Selenium/Python语法即可:
driver.find\u element\u by_xpath(//tr[td[contains(text(),'lost solution')]]/td[2]”
。如果BeautifulSoup有一个通过XPath定位的选项,那么您也可以使用此处的XPath字符串来定位元素。我同意XPath是获取数据的简单方法。如果我没有误解的话,beautifulsoup不支持xpath。谢谢您的帮助。是的,我相信您是正确的,这就是为什么我更喜欢python/selenium方式:)另一位用户建议使用请求库,这可能对您更有帮助。祝你的自动化工作顺利。cURL?:谢谢你,达伦。我尝试了你的代码,不知怎的,我得到了一个错误消息“namererror:name”By“is not defined”?抱歉,我对web报废非常陌生。您需要将selenium.webdriver.common.by import by中的
添加到您的文件的顶部,以使其正常工作。抱歉造成混淆,我正在尝试获取列出的每个国家的溶解度、BCS类(在表的底部)。你能给个建议吗?谢谢。对不起,我是这个社区的新手,不知道这件事。我接受答案了吗?
import requests
from bs4 import BeautifulSoup
import re
import pandas as pd

headers = {
    'Connection': 'keep-alive',
    'Pragma': 'no-cache',
    'Cache-Control': 'no-cache',
    'Origin': 'http://www.ddfint.net',
    'Upgrade-Insecure-Requests': '1',
    'DNT': '1',
    'Content-Type': 'application/x-www-form-urlencoded',
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) '
                  'Chrome/77.0.3865.90 Safari/537.36',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,'
              'application/signed-exchange;v=b3',
    'Referer': 'http://www.ddfint.net/search.cfm',
    'Accept-Encoding': 'gzip, deflate',
    'Accept-Language': 'ru,en-US;q=0.9,en;q=0.8,tr;q=0.7',
}

data = {
    'compoundName': 'Abacavir',
    'category': '',
    'subcategory': '',
    'Submit': 'Search'
}

response = requests.post('http://www.ddfint.net/results.cfm', headers=headers, data=data, verify=False)
page = BeautifulSoup(response.text, 'html5lib')
print(page.find("td", text="Lowest Solubility (mg/ml):").find_next_sibling("td").text)

# get header row
header_row = page.find("td", text="Country List:").find_parent("tr")
# get columns names, and remove : and *
header_data = [re.sub("[:*]", "", td.text.strip()) for td in header_row.find_all("td")]

# loop while there's row after header row
data = []
row = header_row
while True:
    # check if next row exist
    row = row.find_next_sibling("tr")
    if not row:
        break

    # collect row data
    row_data = [td.text.strip() for td in row.find_all("td")]
    data.append(row_data)

# create data frame
df = pd.DataFrame(data, columns=header_data)