我有一些代码,它们曾经可以工作,但由于网站上的更改而不再有效。
我正在尝试从 Apple 页面中获取所有 a
标签,以便编译已弃用方法的列表 - 就像此处列出的方法:https://developer.apple.com/documentation/quartzcore?language=objc
可以在此处找到这些可能包含已弃用方法的方法:https://developer.apple.com/documentation/technologies/
按部分列出方法 - 这里是 Accelerate 的方法之一,
<a data-v-2c210164="" data-v-012d2acf="" href="/documentation/accelerate" class="card" aria-labelledby="card_title_26" aria-describedby="card_content_26"><div data-v-2c210164="" class="card__content"><p data-v-2c210164="" id="card_title_26" aria-label="Accelerate" class="card__title">Accelerate</p></a>
尽管是 a
标记,但以下代码不会选取 href 标记中的 /documentation/accelerate
,而是选取页面上的其他链接,例如页脚。
headers = {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'GET',
'Access-Control-Allow-Headers': 'Content-Type',
'Access-Control-Max-Age': '3600',
'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0'
}
url = "https://developer.apple.com/documentation/technologies"
req = requests.get(url, headers)
soup = BeautifulSoup(req.content, 'html.parser')
for a in soup.find_all('a', href=True):
print str(a)
我做错了什么?
我还尝试了其他匹配项,例如 for a in soup.find_all('a', class_=card):
但这也没有任何结果。
我的猜测是它可以从 Javascript 或其他东西中提取出来?
答案 0 :(得分:2)
如果您查看您的汤,您会确定响应中没有这样的 <a>
。所以你找不到它。
原因是,页面正在处理动态内容。
您可以使用 selenium 来抓取 page_source
因为 selenium 可以很好地处理动态内容:
示例
from selenium import webdriver
from bs4 import BeautifulSoup
from time import sleep
driver = webdriver.Chrome(executable_path='C:\Program Files\ChromeDriver\chromedriver.exe')
url = "https://developer.apple.com/documentation/technologies"
driver.get(url)
sleep(2)
soup = BeautifulSoup(driver.page_source, 'lxml')
for a in soup.find_all('a', href=True):
print(a)
driver.close()