如何在 Python Scraping 中使用 beautifulsoup 和 selenium 识别类名或 id

Posted

技术标签:

【中文标题】如何在 Python Scraping 中使用 beautifulsoup 和 selenium 识别类名或 id【英文标题】:How to identify the classname or id in Python Scraping with beautifulsoup and selenium 【发布时间】:2019-05-06 14:21:24 【问题描述】:

我正在构建一个爬虫代码,并且已经能够读取表格和我想要的信息。问题在于下一页链接,我尝试使用类名以及 svg 标记,但是随着类名值的更改,代码会中断。

这是页面的链接

Page to scrape

代码运行到点击下一页的元素css的代码是这样的

driver.find_element_by_css_selector('#root > div > div > main > div.ez6st4XksKUGZfGdvIhjV > section > div:nth-child(1) > div._1c5cPqlj4FoguvpKXSY69p > div > span:nth-child(3) > svg').click()

似乎当类名的值发生更改时,它会中断并更改要单击的元素,我还没有找到一种方法来重复而不更改元素以便重复具有相同结构的多个页面。

谢谢

【问题讨论】:

【参考方案1】:

您可以使用下面的行来单击下一步按钮,而无需参考动态类名:

driver.find_element_by_xpath('//span[@value]/following-sibling::span/*[name()="svg"]').click()

与 CSS-selector 相同:

driver.find_element_by_css_selector('span[value] + span > svg')

更新

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

while True:
    try:
        wait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'span[value] + span > svg'))).click()
    except:
        break

【讨论】:

我仍然无法弄清楚 name() 是如何工作的 @sir Andersson。它只适用于标签吗? @SIM svg(以及所有可能的后代)不是来自html namespace,而是来自SVG namespace,因此您不能仅使用//svg 来定位它。你应该使用//*[name()="svg"]。它也适用于属性。例如,//@*[name()="id"]。请注意,在 CSS 选择器中,您可以将 svg 定位为公共元素... 您创建 xpath 的方式令人羡慕先生。但是,问题是我没有找到任何可以了解name() 函数用法的链接。谢谢。 @SIM 是的,documentation 根本没有提供任何信息 :) 您只需记住,如果您使用不同的命名空间,name 函数就是您所需要的。请注意,还有 local-name 函数也可以工作 almost in the same way 谢谢安德森,实际上代码在第 4 页的一半处中断,而不是继续到第 6 页【参考方案2】:

因为你可以点击跨度你也可以使用

from selenium import webdriver
d  = webdriver.Chrome()
url = 'https://super.walmart.com.mx/despensa/enlatados-y-conservas/chiles-enlatados/_/N-10kldy7?%2Fdespensa%2Fenlatados-y-conservas%2Fchiles-enlatados%2F_%2FN-10kldy7%3F%2Fdespensa%2Fenlatados-y-conservas%2Fchiles-enlatados%2F_%2FN-10kldy7%3F%2Fdespensa%2Fenlatados-y-conservas%2Fchiles-enlatados%2F_%2FN-10kldy7%3FNs=product.displayText%7C0&offSet=0&storeId=0000009999&No=40'
d.get(url)
# example number of clicks below
for i in range(2):
    d.find_element_by_xpath("//*[starts-with(@d,'M0')]/parent::*/parent::span").click()

【讨论】:

以上是关于如何在 Python Scraping 中使用 beautifulsoup 和 selenium 识别类名或 id的主要内容,如果未能解决你的问题,请参考以下文章

使用 Python 和 asyncio 进行 Web Scraping

多处理在python web-scraping中不起作用

Rap Genius w/ Python 上的 Web Scraping Rap 歌词

阅读OReilly.Web.Scraping.with.Python.2015.6笔记---找出网页中所有的href

无法在 CSV 中存储信息(Python Web Scraping)

Python的基本Web Scraping(Beautifulsoup和Requests)