这里是链接网站从那里我想提取数据,我想获得的所有文字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 -选择在产品类型的单选按钮的第一个值
为了提取内的所有文本值<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
看起来当网站首次加载的所有产品都装为好。 底部的分页实际上并没有改变不同的页面。 因此,你可以提取所有产品上的第一个请求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)
如果你需要的所有链接值,你应该使用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循环