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