如何从提取所有的文本标签通过使用Python中的硒(How to extract all the t

2019-10-30 03:03发布

这里是链接网站从那里我想提取数据,我想获得的所有文字href下锚标记属性。 下面是示例HTML:

<div id="borderForGrid" class="border">
  <h5 class="">
    <a href="/products/product-details/?prod=30AD">A/D TC-55 SEALER</a>
  </h5>

<div id="borderForGrid" class="border">
  <h5 class="">
    <a href="/products/product-details/?prod=P380">Carbocrylic 3356-1</a>
 </h5>

我想提取所有文本值等['A/D TC-55 SEALER','Carbocrylic 3356-1']
我试着用:

target = driver.find_element_by_class_name('border')
anchorElement = target.find_element_by_tag_name('a')
anchorElement.text

但它给'' (空)字符串。

如何任何建议可以实现?

PS -选择在产品类型的单选按钮的第一个值

Answer 1:

为了提取内的所有文本值<a>标签例如[“A / D TC-55 SEALER”,“Carbocrylic 3356-1”],则具有诱导WebDriverWait用于visibility_of_all_elements_located()和可以使用下面的任一解决方案:

  • 使用CSS_SELECTOR

     print([my_elem.get_attribute("innerHTML") for my_elem in WebDriverWait(driver, 5).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "li.topLevel[data-types='Acrylics'] h5>a[href^='/products/product-details/?prod=']")))]) 
  • 使用XPATH

     print([my_elem.get_attribute("innerHTML") for my_elem in WebDriverWait(driver, 5).until(EC.visibility_of_all_elements_located((By.XPATH, "//li[@class='topLevel' and @data-types='Acrylics']//h5[@class]/a[starts-with(@href, '/products/product-details/?prod=')]")))]) 
  • 注意 :您要添加以下的进口:

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


Answer 2:

看起来当网站首次加载的所有产品都装为好。 底部的分页实际上并没有改变不同的页面。 因此,你可以提取所有产品上的第一个请求http://www.carboline.com/products/ 。 我用python requests ,以获取网站的HTMLlxml html解析HTML

我会留硒等程。如果可能的话(有时候你别无选择)。 但是,如果该网站是像在你的问题超级简单。 然后,我会建议只是作出request 。 这避免了使用浏览器的所有额外的开销,因为您只请求你所需要的。

**我更新我的回答也告诉你如何可以提取hreftext在同一时间。

import requests

from lxml import html

BASE_URL = 'http://www.carboline.com'

def extract_data(tree):
    elements = [
        e
        for e in tree.cssselect('div.border h5 a')
        if e.text is not None
    ]
    return elements

def build_data(data):
    dataset = []

    for d in data:
        link = BASE_URL + d.get('href')
        title = d.text

        dataset.append(
            {
                'link':link,
                'title':title
            }
        )

    return dataset

def request_website(url):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36'
    }
    r = requests.get(url, headers=headers)
    return r.text

response = request_website('http://www.carboline.com/products/')
tree = html.fromstring(response)
data = extract_data(tree)
dataset = build_data(data)
print (dataset)


Answer 3:

如果你需要的所有链接值,你应该使用find_elements_....功能,不find_element_...充当后者将返回第一单匹配。

推荐更新您的代码:

driver.get("http://www.carboline.com/products/")
for link in driver.find_elements_by_xpath("//ul[@id='productList']/descendant::*/a"):
    if link.is_displayed():
        print(link.text)

更多信息:

  • find_elements_by_xpath(的XPath)
  • 定位元素
  • XPath的教程
  • XPath运算符和函数
  • Python的IF ... ELSE
  • Python的For循环


文章来源: How to extract all the texts from tag using Selenium through Python