Найти элемент по xpath, где xpath имеет переменную - PullRequest
0 голосов
/ 14 апреля 2020

Я хотел бы найти 'Код' из https://www.asx300list.com/. Ниже приведены пути xpath для кода:

ABP

//*[@id="post-2"]/div/table/tbody/tr[1]/td[1]

AX1

//*[@id="post-2"]/div/table/tbody/tr[2]/td[1]

Как вы можете видеть изменения xpath, основанные на '[tr]' .

Я попытался создать код, который изменяет переменную для каждого xpath, но я продолжаю получать сообщение о том, что это недопустимое выражение xpath.

from selenium import webdriver
chrome_path = r"C:\Users\Harrison Pollock\Downloads\Python\chromedriver_win32\chromedriver.exe"
driver = webdriver.Chrome(chrome_path)
driver.get('https://www.asx300list.com/')
for tr in range(1,300):
    codes = driver.find_elements_by_xpath('//*[@id="post 2"]/div/table/tbody/tr[{tr}]/td[1]')
    lencodes = len(codes)
    for i in range(lencodes):
        print(codes[i].text)  
SyntaxError: Failed to execute 'evaluate' on 'Document': The string '//*[@id="post-2"]/div/table/tbody/tr[{tr}]/td[1]' is not a valid XPath expression.

Ответы [ 4 ]

1 голос
/ 14 апреля 2020

Попробуйте ниже:

wait = WebDriverWait(driver, 20)
Codes=wait.until(EC.presence_of_all_elements_located((By.XPATH, "//table[@class='tableizer-table sortable']//tbody//tr[*]//td[1]")))
 for code in Codes:
       print code.text

Примечание: , пожалуйста, добавьте ниже импорта в ваше решение

from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
1 голос
/ 14 апреля 2020

Чтобы получить код из таблицы Induce WebDriverWait () и дождаться visibility_of_all_elements_located () и следующих xpath

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

from selenium import webdriver
chrome_path = r"C:\Users\Harrison Pollock\Downloads\Python\chromedriver_win32\chromedriver.exe"
driver = webdriver.Chrome(chrome_path)
driver.get('https://www.asx300list.com/')
elements=WebDriverWait(driver,20).until(EC.visibility_of_all_elements_located((By.XPATH,"//table[@class='tableizer-table sortable']/tbody//tr/td[1]")))
for element in elements:
    print(element.text)

Выход :

ABP
AX1
ABC
APT
AGL
AQG
ALQ
ALU
AWC
AMA
AYS
AMC
AMP
ANN
APE
APA
ADI
APX
ARB
ALG
ARF
ALL
AHY
ASX
ALX
AUB
AIA
AD8
AMI
AZJ
AST
ASB
ANZ
AAC
API
AVN
AVH
BBN
BOQ
BAP
BPT
BGA
BGL
BEN
BHP
BIN
BKL
BSL
BLD
BXB
BVS
BRG
BKW
BUB
BWP
BWX
CTX
CDD
CVN
CAR
CWP
CNI
CIP
COF
CGF
CIA
CHC
CLW
CQR
CQE
CNU
CIM
CWY
CUV
CCL
COH
CDA
COL
CKF
CBA
CPU
COE
CTD
CGC
CCP
CMW
CWN
CSL
CSR
DCN
DTL
DXS
DHG
DMP
DOW
ECX
ELD
EHL
EML
EHE
A2M
EVN
FAR
FBU
FLT
FMG
FNP
FPH
FXL
GDI
GEM
GMA
GMG
GNC
GOR
GOZ
GPT
GUD
GWA
GXY
HLS
HPI
HSN
HT1
HUB
HVN
IAG
IAP
IEL
IFL
IFM
IFN
IGL
IGO
ILU
IMD
IMF
INA
ING
INR
IPH
IPL
IRE
IRI
ISX
ITG
IVC
JBH
JHC
JHG
JHX
JIN
JMS
KAR
KGN
LIC
LLC
LNK
LOV
LYC
MAH
MFG
MGR
MGX
MIN
MLD
MMS
MND
MNY
MP1
MPL
MQG
MSB
MTS
MVF
MYR
MYS
MYX
NAB
NAN
NCK
NCM
NCZ
NEA
NEC
NGI
NHC
NHF
NIC
NSR
NST
NUF
NWH
NWL
NWS
NXT
OFX
OGC
OML
ORA
ORE
ORG
ORI
OSH
OZL
PDL
PDN
PET
PGH
PLS
PME
PMV
PNI
PNV
PPT
PRN
PRU
PTM
QAN
QBE
QUB
RDC
REA
REG
RFF
RHC
RIO
RMD
RMS
RRL
RSG
RWC
S32
SAR
SBM
SCG
SCP
SDA
SDF
SEK
SFR
SGF
SGM
SGP
SGR
SHL
SHV
SIG
SIQ
SKC
SKI
SLC
SLR
SM1
SOL
SPK
SPL
SSM
STO
SUL
SUN
SVW
SWM
SXL
SXY
SYD
SYR
TAH
TCL
TGR
TLS
TNE
TPM
TWE
UMG
URW
VCX
VEA
VOC
VRL
VRT
VUK
VVR
WAF
WBC
WEB
WES
WGX
WHC
WOR
WOW
WPL
WPP
WSA
WTC
XRO
Z1P

Process finished with exit code 0
0 голосов
/ 14 апреля 2020

Пропуск спецификации tr [1] или [2] даст оба, поэтому вы можете использовать

//*[@id="post-2"]/div/table/tbody/tr/td[1]
0 голосов
/ 14 апреля 2020

Я считаю, что это python проблема с конкатенацией строк. Попробуйте

codes = driver.find_elements_by_xpath('//*[@id="post 2"]/div/table/tbody/tr[' + str(tr) + ']/td[1]')

Ваш последний xpath все еще имеет {tr} там, где должно быть число, проверьте эту справку для объединения строк: https://www.jquery-az.com/5-ways-python-string-concatenation-6-examples/

, поскольку ваша переменная tr является целым числом, вам также необходимо привести ее к строке str(tr)

BTW. Я думаю, вы могли бы использовать более простой xpath //*[@id="post 2"]//tr[' + str(tr) + ']/td[1]')

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...