Python 如何从表行中刮取特定单词?

Python 如何从表行中刮取特定单词?,python,selenium,xpath,beautifulsoup,css-selectors,Python,Selenium,Xpath,Beautifulsoup,Css Selectors,我只想使用python从下表中提取代码 如图所示,您可以看到我只想刮取CPT、CTC、PTC、STC、SPT、HTC、P5TC、P1A、P2A、P3A、P1E、P2E、P3E。该代码可能会不时更改,如添加P4E或删除P1E 上表的HTML代码为: 产品描述 定期租船旅行:CPT、CTC、PTC、STC、SPT、HTC、P5TC定期租船旅行:P1A、P2A、P3A、P1E、P2E、P3E 航程:C3E、C4E、C5E、C7E 合同规模 一天 1000公吨 最小刻度 25美元 0.01美元

我只想使用python从下表中提取代码

如图所示,您可以看到我只想刮取CPT、CTC、PTC、STC、SPT、HTC、P5TC、P1A、P2A、P3A、P1E、P2E、P3E。该代码可能会不时更改,如添加P4E或删除P1E

上表的HTML代码为:


产品描述

定期租船旅行:CPT、CTC、PTC、STC、SPT、HTC、P5TC
定期租船旅行:P1A、P2A、P3A、
P1E、P2E、P3E

航程:C3E、C4E、C5E、C7E 合同规模

一天

1000公吨

最小刻度

25美元

0.01美元

最终结算价格

浮动价格将是波罗的海交易所提供的日终价格


所有产品:最终结算价格将是到期月份每个交易日波罗的海交易所每日现货价格评估的平均值


P1A、P2A、P3A的例外情况:最终结算价格将是到期月份最后7次波罗的海交易所现货价格评估的平均值

合同系列

CTC、CPT、PTC、STC、SPT、HTC、P5TC:最多72个月的月份、季度和日历年

C3E、C4E、C5E、C7E、P1A、P2A、P3A、P1E、P2E、P3E:月份、季度和日历年最多36个月

结算

合同系列内每月最后一个工作日的13:00(英国时间)


如果您的用例是删除所有文本:

您必须为所需的
可见性诱导\u元素\u located()
,并且您可以使用以下任一选项:

  • 使用
    CSS\u选择器

    driver.get('https://www.eex.com/en/products/global-commodities/freight')
    print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "article div:last-child table>tbody>tr td:nth-child(2)>p"))).text)
    
  • 使用
    XPATH

    driver.get('https://www.eex.com/en/products/global-commodities/freight')
    print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//h3[text()='Contract Specifications']//following::table[1]/tbody/tr//following::td[1]/p"))).text)
    
  • 控制台输出:

    Time Charter: CPT, CTC, PTC, STC, SPT, HTC, P5TC
    Time Charter Trip: P1A, P2A, P3A,
    P1E, P2E, P3E
    
    CPT, CTC, PTC, STC, SPT, HTC, P5TC
    P1A, P2A, P3A,
    P1E, P2E, P3E
    
  • 注意:您必须添加以下导入:

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

更新1 如果要分别提取CPT、CTC、PTC、STC、SPT、HTC、P5TC和P1A、P2A、P3A和P1E、P2E、P3E,可以使用以下解决方案:

  • 印刷CPT、CTC、PTC、STC、SPT、HTC、P5TC

  • 打印P1A、P2A和P3A

  • 打印P1E、P2E、P3E


更新2 要同时打印所有项目,请执行以下操作:

  • 代码块:

    driver.get('https://www.eex.com/en/products/global-commodities/freight')
    element = WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//h3[text()='Contract Specifications']//following::table[1]/tbody/tr//following::td[1]/p")))
    first = driver.execute_script('return arguments[0].childNodes[1].textContent;', element).strip()
    second = driver.execute_script('return arguments[0].childNodes[4].textContent;', element).strip()
    third = driver.execute_script('return arguments[0].lastChild.textContent;', element).strip()
    for list in (first,second,third):
        print(list)
    
  • 控制台输出:

    Time Charter: CPT, CTC, PTC, STC, SPT, HTC, P5TC
    Time Charter Trip: P1A, P2A, P3A,
    P1E, P2E, P3E
    
    CPT, CTC, PTC, STC, SPT, HTC, P5TC
    P1A, P2A, P3A,
    P1E, P2E, P3E
    

如果变量
txt
包含问题中的HTML,则此脚本将提取所有必需的代码:

import re
from bs4 import BeautifulSoup

soup = BeautifulSoup(txt, 'html.parser')
text = soup.select_one('td:contains("Time Charter:")').text
codes = re.findall(r'[A-Z\d]{3}', text)

print(codes)
印刷品:

['CPT', 'CTC', 'PTC', 'STC', 'SPT', 'HTC', 'P5T', 'P1A', 'P2A', 'P3A', 'P1E', 'P2E', 'P3E']

编辑:要从所有表中获取代码,可以使用以下脚本:

import re
from bs4 import BeautifulSoup

soup = BeautifulSoup(txt, 'html.parser')
all_codes = []
for td in soup.select('td:contains("Time Charter:")'):
    all_codes.extend(re.findall(r'[A-Z\d]{3}', td.text))
print(all_codes)

谢谢你。但我只想要列表中的代码。像['CPT'、'CTC'、'PTC'、'STC'、'SPT'、'HTC'、'P5TC'、'P1A'、'P2A'、'P1E'、'P2E'、'P3E']@chintanpatel查看更新的答案并让我知道状态。谢谢Andrej。这有帮助。但如果页面包含两个表,您可以告诉我需要什么类型的修改。所以在这个代码中(text=soup.select_one('td:contains(“定期租船合同”)))。text)只从第一个表中提取代码。第二页还包含定期租船合同下的代码表。代码输出分为两组。如果您可以更新代码以在1个集合中获得此信息,那将是非常棒的。您的输出:['CPT','CTC','PTC','STC','SPT','HTC','P5TC','P1A','P2A','P3A','P1E','P2E','P3E','OCPM','OCTM','OTSM','OHTM','O5PM']]所需输出:['CPT','CTC','PTC','STC','SPT','HTC','P5TC','P1A','P2A','P3A','P1E','P3E','P3E','OCPM','OCPM','OPTM','OTSM','OPSM','OPSM','O5PM']非常感谢你。回答得很好@Andrej Kesely。这是一个完整的解决方案。非常感谢。
import re
from bs4 import BeautifulSoup

soup = BeautifulSoup(txt, 'html.parser')
all_codes = []
for td in soup.select('td:contains("Time Charter:")'):
    all_codes.extend(re.findall(r'[A-Z\d]{3}', td.text))
print(all_codes)