社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  QHarr  »  全部回复
回复总数  16
4 年前
回复了 QHarr 创建的主题 » Python访问Menards网站上的特定元素

您可以使用css子级 > 和后代 组合符,用于指定具有类的父对象的直接子对象或子对象(分别) search-item ,在一个只分离出感兴趣的HREF的序列中

links = [i.text for i in 
         driver.find_elements_by_css_selector("#search-items > .search-item .details > a")]
5 年前
回复了 QHarr 创建的主题 » 为什么从Python中读取HTML不起作用?

因为需要一个用户代理头,不能用 read_html .你可以先拿桌子 requests ,指定适当的标题,然后移交给熊猫:

from pandas import read_html as rh
import requests
from bs4 import BeautifulSoup as bs

r = requests.get('https://finance.yahoo.com/quote/NFLX/history?p=NFLX%27', headers = {'User-Agent':'Mozilla/5.0'})
soup = bs(r.content, 'lxml')
table = rh(str(soup.select_one('[data-test="historical-prices"]')))[0]
print(table)
7 年前
回复了 QHarr 创建的主题 » 使用python-anydrop进行Selenium web抓取

为什么不找出这些下拉列表的数量,然后将每个下拉列表循环设置为一个变量,并使用通常的语法选择其中的选项?

number_of_dropdowns =  len(WebDriverWait(driver,10).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "[id^='msku-sel-']"))))

for i in range(1, number_of_dropdowns + 1):
    current_dropdown = driver.find_element_by_css_selector("[id^='msku-sel-" + str(i) + "']")
    #then use usual syntax to work with select 

Selenium - Python - drop-down menu option value


等待条件的导入:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

循环示例:

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
from selenium.webdriver.support.select import Select

urls = ['https://www.ebay.co.uk/itm/Pashmina-Scarf-100-Viscose-Plain-Wrap-Shawl-Stole-Scarf-Many-Colours-Available/252342060680']
d = webdriver.Chrome()

for url in urls:
    d.get(url)
    number_of_dropdowns =  len(WebDriverWait(d,10).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "[id^='msku-sel-']"))))

    for i in range(1, number_of_dropdowns + 1):
        #then use usual syntax to work with select 
        select = Select(d.find_element_by_css_selector("[id^='msku-sel-" + str(i) + "']"))
        options = select.options
        for index in range(1, len(options) - 1): #avoid first index
            select.select_by_index(index)
            #print(select.first_selected_option.text)
            #your code to extract info per option goes here

您可以使用pandas read_html获取表,然后在klasse列上筛选

import pandas as pd

def get_lectures_two(df, klasse):    
    new_df = df[df['(Klasse(n))'] == klasse]
    return new_df

def get_df(url):
    df = pd.read_html(url)[0]
    df = df[~df['Stunde'].str.contains("LEHRER")]
    return df

df = get_df('https://niwla23.gitlab.io/download/vertreterdemo.html')
print(get_lectures_two(df, '5b'))

在bs4 4.7.1+中,您可以使用:contains和:has,以及通过nth类型的适当列索引来针对适当的行(我在这里使用pandas只是为了快速生成一个很好的表格输出以供查看。。。。您已经拥有来自bs4的列表列表,并且可以使用csv编写示例)

import requests
from bs4 import BeautifulSoup as bs
import pandas as pd

def get_lectures(klasse):
    rows = []
    for row in soup.select(f'.mon_list tr:has(td:nth-of-type(5):contains("{klasse}"))'):
        rows.append([td.text.replace('\xa0','') for td in row.select('td')])
    return rows

r = requests.get('https://niwla23.gitlab.io/download/vertreterdemo.html')
soup = bs(r.content, 'lxml')
headers = [th.text for th in soup.select('th.list')]
klasse = '5b'

df = pd.DataFrame(get_lectures(klasse), columns = headers)
print(df)
7 年前
回复了 QHarr 创建的主题 » Python Selenium-获取ref值

您需要driver.find_元素(如果有多个元素)。这将返回一个列表。对于css选择器,您要确保为具有子href的类选择

elems = driver.find_elements_by_css_selector(".sc-eYdvao.kvdWiq [href]")
links = [elem.get_attribute('href') for elem in elems]

您可能还需要等待css选择器找到的所有元素的出现。

elems = WebDriverWait(driver,10.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".sc-eYdvao.kvdWiq [href]")))
7 年前
回复了 QHarr 创建的主题 » 如何使用selenium python从动态网站检索所有链接

您可以尝试使用控制汇总,方法是提取结果汇总并将特色汇总添加到其中。这些数字已经提供给您,因此您可以循环直到hrefs满足这个要求。您可能想在循环中添加超时。

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.common.exceptions import TimeoutException

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')

prefs = {'profile.managed_default_content_settings.images':2}
chrome_options.add_experimental_option("prefs", prefs)
driver = webdriver.Chrome(chrome_options=chrome_options) 
driver.get("http://biggestbook.com/ui/catalog.html#/search?cr=1&rs=12&st=BM&category=1")
wait = WebDriverWait(driver,20)
nonFeaturedTotal = int(wait.until(EC.presence_of_element_located((By.CSS_SELECTOR , '.ess-view-item-count-text'))).text.split(' ')[-1])
featuredTotal = len(wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".ess-product-container-featured"))))
expectedTotal = featuredTotal + nonFeaturedTotal

while False:
    len(driver.find_elements_by_css_selector(".ess-product-brand + [href]")) == expectedTotal

links = driver.find_elements_by_css_selector(".ess-product-brand + [href]")
results = [link.get_attribute("href") for link in links]

print(len(results))
print(links)

driver.quit()
7 年前
回复了 QHarr 创建的主题 » 废前100名的工作结果确实使用了美化组python

分10批进行,更改url中的起始值。可以循环递增和添加add变量

https://www.indeed.co.in/jobs?q=software+developer&l=Bengaluru%2C+Karnataka&start=0

https://www.indeed.co.in/jobs?q=software+developer&l=Bengaluru,+Karnataka&start=1

例如。

import requests
from bs4 import BeautifulSoup as bs
import pandas as pd
results = []
url = 'https://www.indeed.co.in/jobs?q=software+developer&l=Bengaluru,+Karnataka&start={}'
with requests.Session() as s:
    for page in range(5):
        res = s.get(url.format(page))
        soup = bs(res.content, 'lxml')
        titles = [item.text.strip() for item in soup.select('[data-tn-element=jobTitle]')]
        companies = [item.text.strip() for item in soup.select('.company')]
        data = list(zip(titles, companies))
        results.append(data)
newList = [item for sublist in results for item in sublist]
df = pd.DataFrame(newList)
df.to_json(r'C:\Users\User\Desktop\data.json')
7 年前
回复了 QHarr 创建的主题 » Python中使用带循环的漂亮汤的Webscrape交互式图表

以下是我将如何为所有地区。需要bs4 4.7.1。AFAICS你必须假设公司的顺序是一致的。

import requests
from bs4 import BeautifulSoup
import pandas as pd

r = requests.get("https://opensignal.com/reports/2019/04/uk/mobile-network-experience")
soup = BeautifulSoup(r.content,'lxml') #'html.parser' if lxml not installed
metrics = ['4g-availability', 'video-experience', 'download-speed' , 'upload-speed', 'latency']
headers = ['02', 'Vodaphone', '3', 'EE']
results = []

for region in soup.select('.s-regional-analysis__region'):
    for metric in metrics:
        providers = [item.text for item in region.select('.c-ru-chart:has([data-metric="' + metric + '"]) .c-ru-graph__number')]
        row = {headers[i] : providers[i] for i in range(len(providers))}
        row['data-metric'] = metric
        row['region'] = region['id'] 
        results.append(row)

df = pd.DataFrame(results, columns = ['region', 'data-metric', '02','Vodaphone', '3', 'EE'] )
print(df)

样本输出:

enter image description here

7 年前
回复了 QHarr 创建的主题 » Web废料python,在网站上提交搜索表单,不更改url

页面使用lat和lon来请求数据。您可以模拟xhr(首先获取传递位置的lat和lon,我使用 free API 为了这个。你怎么做取决于你自己。)


您可以在这里看到请求:

enter image description here


响应json包含针对键的html行。输出示例


由于与行中键相关联的内部值是html,所以我将其传递回BeautifulSoup进行处理。html内容示例:

enter image description here


import requests
import json
import pandas as pd
from bs4 import BeautifulSoup as bs
apiKey = "yourFreeAPIkey"
address = "78759" 

url = "https://api.opencagedata.com/geocode/v1/json?q=" + address + "&key=" + apiKey + "&pretty=1"
res = requests.get(url).json()
data = res['results'][1]['geometry']
lat = data['lat']
lng = data['lng']
date = '2019-03-09'
res = requests.get('https://www.imax.com/showtimes/ajax/theatres?date=' + date + '&lat=' + str(lat) + '&lon=' + str(lng))
soup = bs(res.content, 'lxml')
newData = json.loads(soup.select_one('p').text)
columns = ['movieTitle', 'movieLink', 'theatreLink', 'address','movieFormat', 'times']
baseURL = 'https://www.imax.com'
results = []

for row in newData['rows']:
    soup = bs(row['row'], 'lxml')
    link = baseURL + soup.select_one('a')['href']
    address = soup.select_one('.theatre-address').text.strip()
    movieTitle = soup.select_one('.movie-title').text.strip()
    movieLink = baseURL + soup.select_one('.movie-title a')['href']
    movieFormat = soup.select_one('.movie-format').text.strip()
    times = [item.text.strip() for item in soup.select('.line-items a')]
    results.append([movieTitle, movieLink, link, address, movieFormat, times])
df = pd.DataFrame(results, columns = columns)
print(df)

示例结果:

7 年前
回复了 QHarr 创建的主题 » 如何用Python从web API中收集所有结果?

要添加到已经给出的答案中,您可以从初始json获得总结果。然后可以使用循环来增加批处理

import requests
import json

url = "https://clinicaltrialsapi.cancer.gov/v1/clinical-trials"
r = requests.get(url).json()
num_results = int(r['total'])
results_per_request = 50
total = 0
while total < num_results:
    total+=results_per_request
    print(total)

以下是一些取决于整个html的可能性

#class selector

driver.find_element_by_css_selector('.pricingSummary-priceList-value').text.replace('$','')

#attribute selector
driver.find_element_by_css_selector('[itemprop=youSave]').text.replace('$','')

#combined
driver.find_element_by_css_selector('[itemprop=youSave].pricingSummary-priceList-value').text.replace('$','')

#combined with type selector
driver.find_element_by_css_selector('dd[itemprop=youSave].pricingSummary-priceList-value').text.replace('$','')

如果需要多个匹配项,则使用列表理解示例( find_elements 返回列表):

[i.text.replace('$','') for i in driver.find_elements_by_css_selector('[itemprop=youSave]')]

类比类型快,类型比属性快。在某种程度上,短组合比长组合更快,这取决于之前给出的规则和顺序,但这超出了本文的范围。

我使用了一个多值类的单个类。你可以在其他类中添加

driver.find_element_by_css_selector('.saleprice.pricingSummary-priceList-value').text.replace('$','')
7 年前
回复了 QHarr 创建的主题 » 下载word文档python

更重要的是,您可以使用或css选择器语法来组合pdf、docx等。注意,您仍然需要完成一些路径,例如带有前缀 "http://www.soc.napier.ac.uk/~40009856/CW/" . 以下用途 attribute = value 带$operator的css选择器语法(这意味着属性字符串的值以结尾)

from bs4 import BeautifulSoup
import requests
url= 'http://www.soc.napier.ac.uk/~40009856/CW/'
res = requests.get(url)
soup = BeautifulSoup(res.content, 'lxml')
items = soup.select("[href$='.docx'], [href$='.pdf'], img[src]")
print([item['href'] if 'href' in item.attrs.keys()  else item['src'] for item in items])
7 年前
回复了 QHarr 创建的主题 » 如何使用selenium+python加载动态内容

实际上,您正在跟踪以下链接(单击时),这样您就可以收集链接,然后使用.get循环。使用 return [...document.querySelectorAll ] 句法

from selenium import webdriver

d = webdriver.Chrome()
d.get("https://www.quora.com/profile/Ashley-Isabella-3")
links = d.execute_script("return [...document.querySelectorAll('.ui_qtext_more_link')].map(link => link['href'])")
info = []
for link in links:
    d.get(link)
    pageInfo = d.execute_script("return [...document.querySelectorAll('.ui_qtext_para')].map(link => link.innerText)")
    info.append(pageInfo)
print(info)
7 年前
回复了 QHarr 创建的主题 » python/selenium未知错误。click()

我认为你可以做到以下几点:

那是css选择器

find_element_by_css_selector(".gradient .delete-tab").click()

这将匹配的元素限制为一个

在你的代码中:

except:
    element_delete = driver.find_element_by_css_selector('.gradient .delete-tab, .btn-delete')
    element_delete.click()

这意味着你可以把这个移到 try 相反,它已经尝试匹配两个选择器。

如果它是所示的最后一个子对象,则可以使用最后一个子选择器

.col-md-6:last-child .ibox-content div

你也可以用第N种

.col-md-6:nth-of-type(n) .ibox-content div

甚至是最后一种

.col-md-6:last-of-type .ibox-content div

你可以把硒和BS4结合起来。

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
import math
from bs4 import BeautifulSoup as bs
import pandas as pd

def getData(properties):
    for aProperty in properties:
        soup = bs(str(aProperty) , 'lxml')
        price = soup.select_one('.property-price-heading').text if soup.select_one('.property-price-heading') is not None else ''       
        header = soup.select_one('.property-marketing-heading').text if soup.select_one('.property-marketing-heading') is not None else ''        
        beds = soup.select_one('.icon-beds span').text if soup.select_one('.icon-beds span') is not None else ''        
        baths = soup.select_one('.icon-baths span').text if soup.select_one('.icon-baths span') is not None else ''    
        garages = soup.select_one('.icon-garages span').text if soup.select_one('.icon-garages span') is not None else ''
        land = soup.select_one('.property-list-land-size .value').text if soup.select_one('.property-list-land-size .value') is not None else ''
        description = soup.select_one('.results-content').text.strip() if soup.select_one('.results-content') is not None else ''
        ref = soup.select_one('.property-list-webref').text.strip() if soup.select_one('.property-list-webref') is not None else ''
        items = [price, header, beds, baths, garages, land, description, ref ]
        result.append(items)
    return result

varUrl = 'https://www.jawitz.co.za/results/residential/for-sale/cape-town/all/?p={}&advanced_search=1&s=-price'
url = 'https://www.jawitz.co.za/results/residential/for-sale/cape-town/all/?advanced_search=1'

driver = webdriver.Chrome()
driver.get(url)
data =  WebDriverWait(driver,10).until(EC.presence_of_element_located((By.CSS_SELECTOR, ".property-list-details")))
numResults = int(driver.find_element_by_id('id_property_count').text.split(' ')[0])

soup = bs(driver.page_source, 'lxml')
properties = soup.select('.property-list-details')

resultsPerPage = 10
numPages = math.ceil(numResults/resultsPerPage)

results = []

results.append(getData(properties))

if numPages > 1:
    for page in range(2, numPages + 1):
        url = varUrl.format(page)
        driver.get(url)
        data =  WebDriverWait(driver,10).until(EC.presence_of_element_located((By.CSS_SELECTOR, ".property-list-details")))
        soup = bs(driver.page_source, 'lxml')
        properties = soup.select('.property-list-details')
        results.append(getData(properties))
        if page > 3:  #delete after testing
            break  #delete after testing

finalList = [item for sublist in results for item in sublist]
print(finalList)