Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 类型错误:';请求';对象不可编辑从HTML解析时出错_Python_Parsing_Web Scraping_Beautifulsoup - Fatal编程技术网

Python 类型错误:';请求';对象不可编辑从HTML解析时出错

Python 类型错误:';请求';对象不可编辑从HTML解析时出错,python,parsing,web-scraping,beautifulsoup,Python,Parsing,Web Scraping,Beautifulsoup,我用BeautifulSoup编写了一个脚本来解析一个网站上的信息,但我遇到了问题 从代码中可以看出,在websiteReq的注释部分,它给出了 引发HTTPError(请求完整的url、代码、消息、hdrs、fp) HTTPError:禁止 我已经在网上搜索过了,推荐使用这个请求。正如代码中所示,我尝试了它,但我得到了TypeError的错误:“Request”对象不可编辑 我想知道我哪里做错了。非常感谢。祝你今天愉快 代码: 更新了答案中的代码: 所以,结果给出了第一页的所有解析信息,大约是

我用BeautifulSoup编写了一个脚本来解析一个网站上的信息,但我遇到了问题

从代码中可以看出,在websiteReq的注释部分,它给出了

引发HTTPError(请求完整的url、代码、消息、hdrs、fp) HTTPError:禁止

我已经在网上搜索过了,推荐使用这个请求。正如代码中所示,我尝试了它,但我得到了TypeError的错误:“Request”对象不可编辑

我想知道我哪里做错了。非常感谢。祝你今天愉快

代码:

更新了答案中的代码:

所以,结果给出了第一页的所有解析信息,大约是30个空缺。如果您想添加其他页面,只需执行+=

from bs4 import BeautifulSoup as bs
import requests
import pandas as pd

for t in range(28):
    url = "https://boss.az/vacancies?action=index&controller=vacancies&only_path=true&page={}&type=vacancies".format(t)
    r = requests.get(url)
    soup = bs(r.content, 'html.parser')

    titles = [i.text for i in soup.select('.results-i-title')]
    #print(titles)
    companies = [i.text for i in soup.select('.results-i-company')]
    #print(companies)
    summaries = [i.text for i in soup.select('.results-i-summary')]

df = pd.DataFrame(list(zip(titles, companies, summaries)), columns = ['Title', 'Company', 'Summary'])
df.to_csv(r'Data.csv', sep=',', encoding='utf-8-sig',index = False )
然而,它现在并没有阅读所有的页面。有什么线索吗?

Request()返回类Request的对象。这是不可容忍的。应该使用此类中的某些方法返回文本/内容。然后你可以用BS解析它

>>> import requests
>>> response = requests.get('https://httpbin.org/get')
>>> print(response.content)
b'{\n  "args": {}, \n  "headers": {\n    "Accept": "*/*", \n    "Accept-Encoding": "gzip, deflate", \n    "Host": "httpbin.org", \n    "User-Agent": "python-requests/2.9.1"\n  }, \n  "origin": "95.56.82.136", \n  "url": "https://httpbin.org/get"\n}\n'
>>> response.json()
{'headers': {'Accept-Encoding': 'gzip, deflate', 'User-Agent': 'python-requests/2.9.1', 'Host': 'httpbin.org', 'Accept': '*/*'}, 'args': {}, 'origin': '95.56.82.136', 'url': 'https://httpbin.org/get'}
>>> response.headers
{'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Server': 'nginx', 'Access-Control-Allow-Credentials': 'true', 'Access-Control-Allow-Origin': '*', 'Content-Length': '237', 'Date': 'Wed, 23 Dec 2015 17:56:46 GMT'}
>>> response.headers.get('Server')
'nginx'
只是路过。。。 与其用漂亮的汤,不如用正则表达式? 像这样:

重新导入
导入请求
数据=[]
s=请求。会话()
page_html=s.get('https://en.boss.az/vacancies',
headers={'User-Agent':'Mozilla/5.0'})
regex_logic=re.compile(
r'.*?(\w |\s)+'))
myiter=re.finditer(正则表达式逻辑,页面html)
尽管如此:
尝试:
data.append(下一个(myiter.group)(1))
除停止迭代外:
打破
下面是更详细的代码,其中包含相当长的正则表达式

其思想是获取GET请求的文本,并使用th regex创建迭代器。我用你的例子得到了我相信的公司名称。然后需要循环遍历迭代器


如果您需要所有页面的数据,只需查找页面数,并按照此特定网站的逻辑编辑带有页面号的get url。

查找所有返回列表,这样您就无法执行此操作。此操作返回的任何变量的文本。我会使用请求,当你的选择器返回相同长度的列表时,将它们压缩并放入带有熊猫的数据框中。然后可以写入csv

from bs4 import BeautifulSoup as bs
import requests
import pandas as pd

url = 'https://boss.az/vacancies'
r = requests.get(url)
soup = bs(r.content, 'lxml')
titles = [i.text for i in soup.select('.results-i-title')]
companies = [i.text for i in soup.select('.results-i-company')]
summaries = [i.text for i in soup.select('.results-i-summary')]
df = pd.DataFrame(list(zip(titles, companies, summaries)), columns = ['Title', 'Company', 'Summary'])
df.to_csv(r'Data.csv', sep=',', encoding='utf-8-sig',index = False )

你想怎么处理这个循环?请求将简单地返回该URL的请求对象表示形式,使用takingTitle、takingCompany和takingDescription等HTML类从网站获取信息。为了获取它们,我必须通过打开URL将BeautifulSoup与html.parser一起使用。如果我错了,请纠正我。如果是这样,那么只需删除循环,它就会很好地工作,但我想从网站上获取所有信息。如果我删除循环,它将只接受HTML类一次。对不起,这不是我问题的答案。@NijatMursali,Request()返回类Request的对象。这是不可容忍的。应该使用此类中的某些方法返回文本/内容。然后你可以用BS来解析它。你能再描述一下吗?如何用它解析网站?请编辑一下你的代码。这是令人惊讶的最佳答案。工作起来很有魅力。我认为你的答案是正确的。你能检查一下更新后的代码吗?问题出在哪里?因为你每次都在覆盖列表。您希望附加到主列表,然后展开并压缩,尽管您可能会发现不同页面上的列表长度不同。你应该把它作为一个新的问题来回答,但是当我看到它没有一个循环,url和我的答案一样的时候。
from bs4 import BeautifulSoup as bs
import requests
import pandas as pd

url = 'https://boss.az/vacancies'
r = requests.get(url)
soup = bs(r.content, 'lxml')
titles = [i.text for i in soup.select('.results-i-title')]
companies = [i.text for i in soup.select('.results-i-company')]
summaries = [i.text for i in soup.select('.results-i-summary')]
df = pd.DataFrame(list(zip(titles, companies, summaries)), columns = ['Title', 'Company', 'Summary'])
df.to_csv(r'Data.csv', sep=',', encoding='utf-8-sig',index = False )