Разделение элементов, возвращаемых xpath запятыми - PullRequest
1 голос
/ 22 апреля 2020

У меня есть простая функция, возвращающая содержимое таблицы, полученной через xpath с веб-сайта:

import traceback
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.proxy import Proxy, ProxyType



def get_hotbird_13e():


    # Downloads an up to date channel/country map for Hotbird 13e.

    try:

        chrome_options = Options()  
        chrome_options.add_argument("--headless")

        driver = webdriver.Chrome(chrome_options=chrome_options)
        driver.get("http://www.eutelsat.com/deploy_tvLineUp/struts/advancedSearch.do?orbitalPositionId=13%B0%20EAST&Langue=EN")

        link_xpath = '/html/body/div[1]/div[3]/div/table'
        link_path = driver.find_element_by_xpath(link_xpath).text

        driver.quit()

        print(link_path)


    except Exception as exc:

        print(traceback.format_exc())


get_hotbird_13e()

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

Что мне нужно изменить в моем коде, чтобы в качестве примера вывести:

TVN TURBO TVN 13° EAST HOTBIRD 13C POLISH HD CONAX / IRDETO / MEDIAGUARD / NAGRAVISION / VIACCESS

. .. становится:

TVN TURBO, TVN, 13° EAST, HOTBIRD 13C, POLISH, HD, CONAX / IRDETO / MEDIAGUARD / NAGRAVISION / VIACCESS

Спасибо

Ответы [ 4 ]

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

XPath 2.0 решение с одним вкладышем:

tokenize(replace(replace(substring-after(normalize-space(string-join(//tr//text()[normalize-space()]|//tr[@class]/@class,",")),",")," ?, ?",","),"oneven","even"),",even,")

Выход:

String='112 UKRAÏNA,Globecast,13° EAST,HOTBIRD 13C,UKRAINIAN,HD,CLEAR'

String='13 ULICA,Cyfrowy Polsat,13° EAST,HOTBIRD 13C,POLISH,HD,CONAX / IRDETO / MEDIAGUARD / NAGRAVISION / VIACCESS'

String='20 MEDIASET,Mediaset,13° EAST,HOTBIRD 13C,ITALIAN,SD,NAGRAVISION / VIDEOGUARD'

String='20 MEDIASET,Mediaset,13° EAST,HOTBIRD 13E,ITALIAN,HD,NAGRAVISION / VIDEOGUARD'

String='2M MONDE,Globecast,13° EAST,HOTBIRD 13B,ARABIC,SD,CLEAR,GENERAL'

String='2M MONDE,Globecast,13° EAST,HOTBIRD 13C,ARABIC,SD,CLEAR,GENERAL'

String='4 FUN DANCE,Cyfrowy Polsat,13° EAST,HOTBIRD 13C,POLISH,SD,CLEAR,MUSIC'

String='4 FUN GOLD,Cyfrowy Polsat,13° EAST,HOTBIRD 13C,POLISH,SD,CLEAR,MUSIC'

String='4 FUN TV,Cyfrowy Polsat,13° EAST,HOTBIRD 13C,POLISH,SD,CLEAR,MUSIC'

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

Выберите строку данных, затем получите значение всех столбцов в списке, а затем соедините с помощью ","

Код :

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

chrome_options = Options()
chrome_options.add_argument("--headless")
driver = webdriver.Chrome(chrome_options=chrome_options)
driver.get("http://www.eutelsat.com/deploy_tvLineUp/struts/advancedSearch.do?orbitalPositionId=13%B0%20EAST&Langue=EN")
WebDriverWait(driver,15).until(EC.presence_of_element_located((By.CSS_SELECTOR,".listresult")))

for row in driver.find_elements_by_xpath("//table[@class='listresult']//tr")[1:]:
    rowwisedata=[td.text.strip() for td in row.find_elements_by_xpath(".//td") if td.text!=""]
    print(','.join(rowwisedata))

Вывод :

112 UKRAÏNA,Globecast,13° EAST,HOTBIRD 13C,UKRAINIAN,HD,CLEAR
13 ULICA,Cyfrowy Polsat,13° EAST,HOTBIRD 13C,POLISH,HD,CONAX / IRDETO / MEDIAGUARD / NAGRAVISION / VIACCESS
20 MEDIASET,Mediaset,13° EAST,HOTBIRD 13C,ITALIAN,SD,NAGRAVISION / VIDEOGUARD
20 MEDIASET,Mediaset,13° EAST,HOTBIRD 13E,ITALIAN,HD,NAGRAVISION / VIDEOGUARD
2M MONDE,Globecast,13° EAST,HOTBIRD 13B,ARABIC,SD,CLEAR,GENERAL
2M MONDE,Globecast,13° EAST,HOTBIRD 13C,ARABIC,SD,CLEAR,GENERAL
4 FUN DANCE,Cyfrowy Polsat,13° EAST,HOTBIRD 13C,POLISH,SD,CLEAR,MUSIC
4 FUN GOLD,Cyfrowy Polsat,13° EAST,HOTBIRD 13C,POLISH,SD,CLEAR,MUSIC
4 FUN TV,Cyfrowy Polsat,13° EAST,HOTBIRD 13C,POLISH,SD,CLEAR,MUSIC
6TER,Bis TV,13° EAST,HOTBIRD 13B,FRENCH,SD,VIACCESS

And so on....
1 голос
/ 22 апреля 2020

Другое решение:

contents=WebDriverWait(driver, 10).until(
    EC.visibility_of_all_elements_located((By.XPATH, "//table[@class='listresult']//tr[*]")))
for item in contents:
    print item.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 голос
/ 22 апреля 2020

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

link_xpath = '/html/body/div[1]/div[3]/div/table//tr/td'
cells = driver.find_elements_by_xpath(link_xpath)
for cell in cells:
    print(cell.text)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...