Как я могу использовать селен без фактического открытия браузера и получения содержимого таблицы? питон - PullRequest
2 голосов
/ 07 октября 2019

Я пытаюсь запустить программу 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

Ответы [ 3 ]

7 голосов
/ 08 октября 2019

Вы можете попытаться добавить аргумент --headless в ChromeOptions, чтобы сообщить браузеру не отображать.

from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_argument("--headless")
driver = webdriver.Chrome(chrome_options=chrome_options)
3 голосов
/ 08 октября 2019

Вы можете использовать запросы модуль. Существует проблема с получением текста BCS Class (logP) , поскольку HTML-код разбит на обе данные таблицы BCS Class . Решение заключается в использовании 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])

Код с пандами :

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)
2 голосов
/ 08 октября 2019

Вы можете сделать селен без головы, добавив опцию (--headless), например:

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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...