这里是我要从中提取数据的网站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-选择产品类型
下的单选按钮的第一个值答案 0 :(得分:2)
就像第一次加载网站时一样,所有产品也都加载了。底部的分页实际上不会更改为其他页面。因此,您可以在http://www.carboline.com/products/
的第一个请求中提取所有产品。我用python requests
来获取网站HTML
,并用lxml html
来解析HTML
。
如果可能的话,我会远离硒等。(有时您别无选择)。但是,如果网站像您所问的那样超级简单。然后,我建议您制作一个request
。这样就避免了使用浏览器而带来的所有额外开销,因为您仅在请求所需内容。
**我更新了答案,还向您展示了如何同时提取href
和text
。
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)
更多信息: