- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发一些抓取代码,它不断返回一些错误,我想其他人可能会提供帮助。
首先我运行这个片段:
import pandas as pd
from urllib.parse import urljoin
import requests
base = "http://www.reed.co.uk/jobs"
url = "http://www.reed.co.uk/jobs?datecreatedoffset=Today&pagesize=100"
r = requests.get(url).content
soup = BShtml(r, "html.parser")
df = pd.DataFrame(columns=["links"], data=[urljoin(base, a["href"]) for a in soup.select("div.pages a.page")])
df
我在今天的职位发布的第一页上运行了上面的代码片段。然后我提取页面底部的 URL,以便及时找到该时间点存在的页面总数。下面的正则表达式帮我解决了这个问题:
df['partone'] = df['links'].str.extract('([a-z][a-z][a-z][a-z][a-z][a-z]=[0-9][0-9].)', expand=True)
df['maxlink'] = df['partone'].str.extract('([0-9][0-9][0-9])', expand=True)
pagenum = df['maxlink'][4]
pagenum = pd.to_numeric(pagenum, errors='ignore')
请注意上面的第三行,页面数始终包含在此列表中倒数第二个(五个中的)URL 中。我敢肯定有一种更优雅的方法可以做到这一点,但它就足够了。然后我将从 URL 中获取的数字输入一个循环:
result_set = []
loopbasepref = 'http://www.reed.co.uk/jobs?cached=True&pageno='
loopbasesuf = '&datecreatedoffset=Today&pagesize=100'
for pnum in range(1,pagenum):
url = loopbasepref + str(pnum) + loopbasesuf
r = requests.get(url).content
soup = BShtml(r, "html.parser")
df2 = pd.DataFrame(columns=["links"], data=[urljoin(base, a["href"]) for a in soup.select("div", class_="results col-xs-12 col-md-10")])
result_set.append(df2)
print(df2)
这是我遇到错误的地方。我正在尝试做的是遍历所有列出作业的页面,从第 1 页开始到第 N 页,其中 N = pagenum,然后提取链接到每个单独作业页面的 URL 并将其存储在数据框中.我已经尝试了 soup.select("div", class_="")
的各种组合,但每次都会收到错误消息:TypeError: select() got an unexpected keyword argument ' class_'
.
如果有人对此有任何想法,并且可以看到前进的好方法,我将不胜感激!
干杯
克里斯
最佳答案
你可以一直循环直到没有下一页:
import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin
base = "http://www.reed.co.uk"
url = "http://www.reed.co.uk/jobs?datecreatedoffset=Today&pagesize=100"
def all_urls():
r = requests.get(url).content
soup = BeautifulSoup(r, "html.parser")
# get the urls from the first page
yield [urljoin(base, a["href"]) for a in soup.select("div.details h3.title a[href^=/jobs]")]
nxt = soup.find("a", title="Go to next page")
# title="Go to next page" is missing when there are no more pages
while nxt:
# wash/repeat until no more pages
r = requests.get(urljoin(base, nxt["href"])).content
soup = BeautifulSoup(r, "html.parser")
yield [urljoin(base, a["href"]) for a in soup.select("div.details h3.title a[href^=/jobs]")]
nxt = soup.find("a", title="Go to next page")
只需遍历生成器函数即可从每个页面获取 url:
for u in (all_urls()):
print(u)
我还在选择器中使用了 a[href^=/jobs]
,因为还有其他匹配的标签,所以我们确保只提取工作路径。
在您自己的代码中,使用选择器的正确方法是:
soup.select("div.results.col-xs-12.col-md-10")
您的语法适用于 find 或 find_all,其中您对 css 类使用 class_=...
:
soup.find_all("div", class_="results col-xs-12 col-md-10")
但这无论如何都不是正确的选择器。
不确定您为什么要创建多个 dfs,但如果这是您想要的:
def all_urls():
r = requests.get(url).content
soup = BeautifulSoup(r, "html.parser")
yield pd.DataFrame([urljoin(base, a["href"]) for a in soup.select("div.details h3.title a[href^=/jobs]")],
columns=["Links"])
nxt = soup.find("a", title="Go to next page")
while nxt:
r = requests.get(urljoin(base, nxt["href"])).content
soup = BeautifulSoup(r, "html.parser")
yield pd.DataFrame([urljoin(base, a["href"]) for a in soup.select("div.details h3.title a[href^=/jobs]")],
columns=["Links"])
nxt = soup.find("a", title="Go to next page")
dfs = list(all_urls())
这会给你一个 dfs 列表:
In [4]: dfs = list(all_urls())
dfs[0].head()
In [5]: dfs[0].head(10)
Out[5]:
Links
0 http://www.reed.co.uk/jobs/tufting-manager/308...
1 http://www.reed.co.uk/jobs/financial-services-...
2 http://www.reed.co.uk/jobs/head-of-finance-mul...
3 http://www.reed.co.uk/jobs/class-1-drivers-req...
4 http://www.reed.co.uk/jobs/freelance-middlewei...
5 http://www.reed.co.uk/jobs/sage-200-consultant...
6 http://www.reed.co.uk/jobs/bereavement-support...
7 http://www.reed.co.uk/jobs/property-letting-ma...
8 http://www.reed.co.uk/jobs/graduate-recruitmen...
9 http://www.reed.co.uk/jobs/solutions-delivery-...
但是,如果您只想要一个,那么请使用带有 itertools.chain 的原始代码:
from itertools import chain
df = pd.DataFrame(columns=["links"], data=list(chain.from_iterable(all_urls())))
这将在一个 df 中为您提供所有链接:
In [7]: from itertools import chain
...: df = pd.DataFrame(columns=["links"], data=list(chain.from_iterable(all_
...: urls())))
...:
In [8]: df.size
Out[8]: 675
关于python - 为 soup.select() 正确的 div 类组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40057058/
我不知道“汤”字面意思在与计算机图形相关的“三角形汤”或“多边形汤”中使用时是什么意思。是不是和我们用勺子吃饭的“汤”有关? (我的母语不是英语。) 最佳答案 维基百科来拯救! A polygon s
我们正在废弃 Amazon.in 网站以检索任何产品的价格。所有产品在“span”标签中的“id”属性都具有不同的值,例如; id = 'priceblock_ourprice', id = 'p
我有一个这样的模板: 和这样的输入 HTML COMPLEX HTML 其中 COMPLEX_HTML 是很多子标签(很干净 - 验证) 我试图将输入 HTML 的 body 标记内的 HTML
我对 soup('tag_name') 和 soup.find_all('tag_name') 之间的区别感到困惑。下面是一个包含一小段 html 的示例: from bs4 import Beaut
我正在尝试使用 css 选择器解析 html 页面 import requests import webbrowser from bs4 import BeautifulSoup page = req
这是网页 HTML 源代码的一部分: apple banana cherry melon 我想提取我想要的网址,比如以/Result 开头的网址?我刚刚了解到您可以在 beautiful soup
我注意到一个非常烦人的错误:BeautifulSoup4(包:bs4)经常发现比以前版本(包:BeautifulSoup)更少的标签。 这是该问题的一个可重现的实例: import requests
所以我一直在试图弄清楚如何抓取一个购买/销售网站的网站,我发现了 HTML 中的所有内容,但该类包含不同的随机数,例如:
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwa
我正在尝试加载 html 页面并输出文本,即使我正确获取网页,BeautifulSoup 以某种方式破坏了编码。 来源: # -*- coding: utf-8 -*- import requests
题目地址:https://leetcode.com/problems/soup-servings/description/ 题目描述: There are two types of soup: t
您好,我正在尝试从网站获取一些信息。请原谅我,如果我的格式有任何错误,这是我第一次发布到 SO。 soup.find('div', {"class":"stars"}) 从这里我收到 我需要 “
我想从 Google Arts & Culture 检索信息使用 BeautifulSoup。我检查了许多 stackoverflow 帖子( [1] , [2] , [3] , [4] , [5]
我决定学习 Python,因为我现在有更多时间(由于大流行)并且一直在自学 Python。 我试图从一个网站上刮取税率,几乎可以获得我需要的一切。下面是来自我的 Soup 变量以及相关 Python
我正在使用 beautifulsoup 从页面中获取所有链接。我的代码是: import requests from bs4 import BeautifulSoup url = 'http://ww
我正在尝试根据部分属性值来识别 html 文档中的标签。 例如,如果我有一个 Beautifulsoup 对象: import bs4 as BeautifulSoup r = requests.ge
Показать телефон 如何在 Beautiful Soup 中找到上述元素? 我尝试了以下方法,但没有奏效: show = soup.find('div', {'class': 'acti
我如何获得结果网址:https://www.sec.gov/Archives/edgar/data/1633917/000163391718000094/0001633917-18-000094-in
我是 python 新手,尝试从页面中提取表格,但无法使用 BS4 找到该表格。你能告诉我我哪里出错了吗? import requests from bs4 import BeautifulSoup
我有一个巨大的 XML 文件(1.2 G),其中包含数百万个 MusicAlbums 的信息,每个 MusicAlbums 都具有如下简单格式 P 22 Exitos
我是一名优秀的程序员,十分优秀!