无法使用 Python 和 Selenium 检索 href 属性
Unable to retrieve the href attributes using Python and Selenium
我对此很陌生,花了几个小时尝试我在这里阅读的各种方法。如果我犯了一些愚蠢的错误,我深表歉意
我想为我的 LEGO 套装创建一个数据库。从 brickset.com
中提取图像和信息
我正在使用:
anchors = driver.find_elements_by_xpath('//*[@id="ui-tabs-2"]/ul/li[1]/a')
anchors = [a.get_attribute('href') for a in anchors]
打印(锚点)returns:
anchors = driver.find_elements_by_xpath('//*[@id="ui-tabs-2"]/ul/li[1]/a')
我的目标是什么:
div id="ui-tabs-2" class="ui-tabs-panel ui-widget-content ui-corner-bottom" aria-live="polite" aria-labelledby="ui-id-4" role="tabpanel" aria-expanded="true" aria-hidden="false" style="display: block;">
<ul class="moreimages">
<li>
<a href="https://images.brickset.com/sets/AdditionalImages/21054-1/21054_alt10.jpg" class="highslide plain " onclick="return hs.expand(this)">
<img src="https://images.brickset.com/sets/AdditionalImages/21054-1/tn_21054_alt10_jpg.jpg" title="" onerror="this.src='/assets/images/spacer2.png'" loading="lazy">
</a><div class="highslide-caption">
我正在想办法解决这个问题。
更新
仍然没有获得 href 属性。要添加更多细节,我正在尝试获取此 URL 上“图像”选项卡下的图像:
https://brickset.com/sets/21330-1/Home-Alone
这是有问题的代码:
anchors = driver.find_elements(By.XPATH, '//*[@id="ui-tabs-2"]/ul/li/a')
links = [anchors.get_attribute('href') for a in anchors]
print('Found ' + str(len(anchors)) + ' links to images')
我也试过:
#anchors = driver.find_elements_by_css_selector("a[href*='21330']")
这只返回了一个 href,尽管应该有大约一打。
谢谢大家的协助!
首先,driver.find_elements_by_xpath
已弃用,请改用 driver.find_element(By.XPATH, 'locator')
。
现在,如果您想获取页面上的所有 href
链接:
elements = driver.find_element(By.XPATH, '//*[@id="ui-tabs-2"]/ul/li/a')
links = [element.get_attribute('href') for element in elements]
请注意,我没有使用 [1]
来获取单个元素,而是所有元素。
您不应该对多个变量使用相同的名称。
根据第一行代码:
anchors = driver.find_elements_by_xpath('//*[@id="ui-tabs-2"]/ul/li[1]/a')
anchors
是 WebElements 的列表。理想情况下,要使用 href
属性创建另一个列表,您应该使用另一个名称,例如hrefs
实际上您的代码块将是:
anchors = driver.find_elements_by_xpath('//*[@id="ui-tabs-2"]/ul/li[1]/a')
hrefs = [a.get_attribute('href') for a in anchors]
print(hrefs)
在一行中使用 :
print(a.get_attribute('href') for a in driver.find_elements_by_xpath('//*[@id="ui-tabs-2"]/ul/li[1]/a'))
你可能想试试这个。
注意: 我在这里没有使用 selenium
。
import time
import requests
from bs4 import BeautifulSoup
headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:99.0) Gecko/20100101 Firefox/99.0",
}
sample_urls = [
"https://brickset.com/sets/21330-1/Home-Alone",
"https://brickset.com/sets/21101-1/Hayabusa"
]
with requests.Session() as s:
for sample_url in sample_urls:
ajax_setID = [
a["href"] for a in
BeautifulSoup(s.get(sample_url, headers=headers).text, "lxml").find_all("a")
if "mainImage" in a["href"]
][0]
image_url = f"https://brickset.com{ajax_setID}&_{int(time.time() * 1000)}"
headers.update(
{
"Referer": sample_url,
"X-Requested-With": "XMLHttpRequest",
}
)
source_image = (
BeautifulSoup(
s.get(image_url, headers=headers).text, "lxml"
).find("img")["src"]
)
print(f"{sample_url.split('/', -1)[-1]} -> {source_image}")
这应该输出:
Home-Alone -> https://images.brickset.com/sets/images/21330-1.jpg?202109060933
Hayabusa -> https://images.brickset.com/sets/images/21101-1.jpg?201201150457
我对此很陌生,花了几个小时尝试我在这里阅读的各种方法。如果我犯了一些愚蠢的错误,我深表歉意
我想为我的 LEGO 套装创建一个数据库。从 brickset.com
中提取图像和信息我正在使用:
anchors = driver.find_elements_by_xpath('//*[@id="ui-tabs-2"]/ul/li[1]/a')
anchors = [a.get_attribute('href') for a in anchors]
打印(锚点)returns:
anchors = driver.find_elements_by_xpath('//*[@id="ui-tabs-2"]/ul/li[1]/a')
我的目标是什么:
div id="ui-tabs-2" class="ui-tabs-panel ui-widget-content ui-corner-bottom" aria-live="polite" aria-labelledby="ui-id-4" role="tabpanel" aria-expanded="true" aria-hidden="false" style="display: block;">
<ul class="moreimages">
<li>
<a href="https://images.brickset.com/sets/AdditionalImages/21054-1/21054_alt10.jpg" class="highslide plain " onclick="return hs.expand(this)">
<img src="https://images.brickset.com/sets/AdditionalImages/21054-1/tn_21054_alt10_jpg.jpg" title="" onerror="this.src='/assets/images/spacer2.png'" loading="lazy">
</a><div class="highslide-caption">
我正在想办法解决这个问题。
更新 仍然没有获得 href 属性。要添加更多细节,我正在尝试获取此 URL 上“图像”选项卡下的图像: https://brickset.com/sets/21330-1/Home-Alone 这是有问题的代码:
anchors = driver.find_elements(By.XPATH, '//*[@id="ui-tabs-2"]/ul/li/a')
links = [anchors.get_attribute('href') for a in anchors]
print('Found ' + str(len(anchors)) + ' links to images')
我也试过:
#anchors = driver.find_elements_by_css_selector("a[href*='21330']")
这只返回了一个 href,尽管应该有大约一打。
谢谢大家的协助!
首先,driver.find_elements_by_xpath
已弃用,请改用 driver.find_element(By.XPATH, 'locator')
。
现在,如果您想获取页面上的所有 href
链接:
elements = driver.find_element(By.XPATH, '//*[@id="ui-tabs-2"]/ul/li/a')
links = [element.get_attribute('href') for element in elements]
请注意,我没有使用 [1]
来获取单个元素,而是所有元素。
您不应该对多个变量使用相同的名称。
根据第一行代码:
anchors = driver.find_elements_by_xpath('//*[@id="ui-tabs-2"]/ul/li[1]/a')
anchors
是 WebElements 的列表。理想情况下,要使用 href
属性创建另一个列表,您应该使用另一个名称,例如hrefs
实际上您的代码块将是:
anchors = driver.find_elements_by_xpath('//*[@id="ui-tabs-2"]/ul/li[1]/a')
hrefs = [a.get_attribute('href') for a in anchors]
print(hrefs)
在一行中使用
print(a.get_attribute('href') for a in driver.find_elements_by_xpath('//*[@id="ui-tabs-2"]/ul/li[1]/a'))
你可能想试试这个。
注意: 我在这里没有使用 selenium
。
import time
import requests
from bs4 import BeautifulSoup
headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:99.0) Gecko/20100101 Firefox/99.0",
}
sample_urls = [
"https://brickset.com/sets/21330-1/Home-Alone",
"https://brickset.com/sets/21101-1/Hayabusa"
]
with requests.Session() as s:
for sample_url in sample_urls:
ajax_setID = [
a["href"] for a in
BeautifulSoup(s.get(sample_url, headers=headers).text, "lxml").find_all("a")
if "mainImage" in a["href"]
][0]
image_url = f"https://brickset.com{ajax_setID}&_{int(time.time() * 1000)}"
headers.update(
{
"Referer": sample_url,
"X-Requested-With": "XMLHttpRequest",
}
)
source_image = (
BeautifulSoup(
s.get(image_url, headers=headers).text, "lxml"
).find("img")["src"]
)
print(f"{sample_url.split('/', -1)[-1]} -> {source_image}")
这应该输出:
Home-Alone -> https://images.brickset.com/sets/images/21330-1.jpg?202109060933
Hayabusa -> https://images.brickset.com/sets/images/21101-1.jpg?201201150457