有了BeautifulSoup,这一切都是可行且简单的。
(1) 有没有办法通过标签只找到特定的href?为了
例如,我想要的所有 href 都以某个名称调用,例如
在线目录中的价格。
比如说,你需要的所有链接在文本中都有price - 你可以使用text 参数:
soup.find_all("a", text="price") # text equals to 'price' exactly
soup.find_all("a", text=lambda text: text and "price" in text) # 'price' is inside the text
是的,您可以使用functions 和许多其他不同类型的对象来过滤元素,例如,编译后的regular expressions:
import re
soup.find_all("a", text=re.compile(r"^[pP]rice"))
如果price 位于“href”属性中,您可以使用以下CSS selector:
soup.select("a[href*=price]") # href contains 'price'
soup.select("a[href^=price]") # href starts with 'price'
soup.select("a[href$=price]") # href ends with 'price'
或者,通过find_all():
soup.find_all("a", href=lambda href: href and "price" in href)
(2) 我想要的href链接都在
网页,在页面内和某个 .我可以只访问这些吗
链接?
好的,找到合适的容器并致电find_all() or other searching methods:
container = soup.find("div", class_="container")
for link in container.select("a[href*=price"):
print(link["href"])
或者,您可以编写 CSS 选择器,就像在具有所需属性或属性值的特定元素内搜索链接一样。例如,这里我们正在搜索具有href 属性的a 元素位于具有container 类的div 元素内:
soup.select("div.container a[href]")
(3) 如何抓取每个 href 链接中的内容并保存到
文件格式?
如果我理解正确,您需要获取适当的链接,关注它们并将页面的源代码本地保存到 HTML 文件中。根据您的要求,有多种选项可供选择(例如,速度可能很关键。或者,它只是一项一次性任务,您不关心性能)。
如果您继续使用requests,代码将具有阻塞性质 - 您将提取链接,点击它,保存页面源代码,然后继续下一个 - 它的主要缺点是它会很慢(首先取决于有多少链接)。示例代码助您一臂之力:
from urlparse import urljoin
from bs4 import BeautifulSoup
import requests
base_url = 'http://examplewebsite.com'
with requests.Session() as session: # maintaining a web-scraping session
soup = BeautifulSoup(session.get(base_url).content, "html.parser")
for link in soup.select("div.container a[href]"):
full_link = urljoin(base_url, link["href"])
title = a.get_text(strip=True)
with open(title + ".html", "w") as f:
f.write(session.get(full_link).content)
您可以查看grequests 或Scrapy 来解决这部分问题。