如何通过Python使用Selenium从<a>标记中提取所有文本

时间:2019-06-04 07:44:54

标签: python selenium xpath css-selectors webdriverwait

这里是我要从中提取数据的网站link, 我正在尝试在锚标签下获取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-选择产品类型

下的单选按钮的第一个值

3 个答案:

答案 0 :(得分:2)

就像第一次加载网站时一样,所有产品也都加载了。底部的分页实际上不会更改为其他页面。因此,您可以在http://www.carboline.com/products/的第一个请求中提取所有产品。我用python requests来获取网站HTML,并用lxml 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)

答案 1 :(得分:1)

要提取<a>标签内的所有文本值,例如 ['A / D TC-55 SEALER','Carbocrylic 3356-1'] ,您必须为visibility_of_all_elements_located()生成 WebDriverWait ,并且可以使用以下解决方案:

  • 使用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
    

答案 2 :(得分:0)

如果需要所有链接值,则应使用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)

更多信息: