Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.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 将web数据传递到美丽的汤-空列表_Python_Web Scraping_Beautifulsoup_Urllib3_Web Content - Fatal编程技术网

Python 将web数据传递到美丽的汤-空列表

Python 将web数据传递到美丽的汤-空列表,python,web-scraping,beautifulsoup,urllib3,web-content,Python,Web Scraping,Beautifulsoup,Urllib3,Web Content,我重新检查了我的代码,并查看了打开URL将web数据传递到Beauty Soup中的类似操作,出于某种原因,我的代码没有返回任何内容,尽管它的格式正确: >>> from bs4 import BeautifulSoup >>> from urllib3 import poolmanager >>> connectBuilder = poolmanager.PoolManager() >>> content = con

我重新检查了我的代码,并查看了打开URL将web数据传递到Beauty Soup中的类似操作,出于某种原因,我的代码没有返回任何内容,尽管它的格式正确:

>>> from bs4 import BeautifulSoup

>>> from urllib3 import poolmanager

>>> connectBuilder = poolmanager.PoolManager()

>>> content = connectBuilder.urlopen('GET', 'http://www.crummy.com/software/BeautifulSoup/')

>>> content
<urllib3.response.HTTPResponse object at 0x00000000032EC390>

>>> soup = BeautifulSoup(content)

>>> soup.title
>>> soup.title.name
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'name'
>>> soup.p
>>> soup.get_text()
''

>>> content.data
a stream of data follows...
>>来自bs4导入组
>>>从urllib3导入池管理器
>>>connectBuilder=poolmanager.poolmanager()
>>>content=connectBuilder.urlopen('GET','http://www.crummy.com/software/BeautifulSoup/')
>>>内容
>>>汤=美汤(内容)
>>>汤名
>>>soup.title.name
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
AttributeError:“非类型”对象没有属性“名称”
>>>汤
>>>soup.get_text()
''
>>>内容数据
数据流如下。。。
如图所示,很明显,urlopen()返回一个由变量内容捕获的HTTP响应,它可以读取响应的状态,但在传递到Beautiful Soup后,web数据不会转换为Beautiful Soup对象(变量Soup)。您可以看到,我试图读取一些标记和文本,get_text()返回一个空列表,这很奇怪

奇怪的是,当我通过content.data访问web数据时,数据会显示出来,但它没有用处,因为我无法使用Beautiful Soup解析它。我有什么问题?谢谢

如图所示,很明显urlopen()返回一个HTTP响应,该响应由变量内容捕获

您所谓的
content
不是内容,而是一个类似文件的对象,您可以从中读取内容。BeautifulSoup非常乐意接受这样的东西,但出于调试目的打印出来并没有多大帮助。因此,让我们实际读取其中的内容,以便更容易调试:

>>> response = connectBuilder.urlopen('GET', 'http://www.crummy.com/software/BeautifulSoup/')
>>> response
<urllib3.response.HTTPResponse object at 0x00000000032EC390>
>>> content = response.read()
>>> content
b''
这绝对是一个
beautifulsou
对象

当您传递
BeautifulSoup
一个空字符串时,返回的内容将取决于它在幕后使用的解析器;如果它依赖于Python3.x stdlib,那么您将得到一个
html
节点,它的头是空的
头,体是空的
体,没有其他内容。因此,当您查找
标题
节点时,没有一个节点,您会得到


那么,你如何解决这个问题

如前所述,您使用的是“发出请求的最低级别调用,因此需要指定所有原始详细信息。”这些原始详细信息是什么?老实说,如果你还不知道,你就不应该用这种方法来教你如何处理
urllib3
的秘密细节,甚至在你还不知道基本的东西不会为你提供服务之前

事实上,这里根本不需要
urllib3
。只需使用Python附带的模块:

>>> # on Python 2.x, instead do: from urllib2 import urlopen 
>>> from urllib.request import urlopen
>>> r = urlopen('http://www.crummy.com/software/BeautifulSoup/')
>>> soup = BeautifulSoup(r)
>>> soup.title.text
'Beautiful Soup: We called him Tortoise because he taught us.'

如果您只想刮取页面,
请求
将获得您需要的内容:

from bs4 import BeautifulSoup

import requests
r = requests.get('http://www.crummy.com/software/BeautifulSoup/')
soup = BeautifulSoup(r.content)

In [59]: soup.title
Out[59]: <title>Beautiful Soup: We called him Tortoise because he taught us.</title>

In [60]: soup.title.name
Out[60]: 'title'
从bs4导入美化组
导入请求
r=请求。获取('http://www.crummy.com/software/BeautifulSoup/')
汤=美汤(r.含量)
在[59]中:soup.title
美丽的汤:我们叫他乌龟,因为他教我们。
在[60]中:soup.title.name
Out[60]:“title”

urllib3返回一个响应对象,该对象包含具有预加载车身有效载荷的
.data

根据顶部快速入门,我会这样做:

import urllib3
http = urllib3.PoolManager()
response = http.request('GET', 'http://www.crummy.com/software/BeautifulSoup/')

from bs4 import BeautifulSoup
soup = BeautifulSoup(response.data)  # Note the use of the .data property
...
response = http.request('GET', 'http://www.crummy.com/software/BeautifulSoup/', preload_content=False)
soup = BeautifulSoup(response)  # We can pass the original `response` object now.
其余部分应按预期工作

--

关于原始代码中的错误:

您传递了整个
响应
对象,而不是主体有效载荷。这通常是可以的,因为
响应
对象是一个类似文件的对象,但在本例中,urllib3已经使用了所有响应并为您解析它,因此
.read()
没有任何剩余内容。这就像传递一个已经读取的文件指针<另一方面,code>.data
将访问已读取的数据

如果要将urllib3响应对象用作类似文件的对象,则需要禁用内容预加载,如下所示:

import urllib3
http = urllib3.PoolManager()
response = http.request('GET', 'http://www.crummy.com/software/BeautifulSoup/')

from bs4 import BeautifulSoup
soup = BeautifulSoup(response.data)  # Note the use of the .data property
...
response = http.request('GET', 'http://www.crummy.com/software/BeautifulSoup/', preload_content=False)
soup = BeautifulSoup(response)  # We can pass the original `response` object now.
现在,它应该像您预期的那样工作

我知道这不是很明显的行为,作为urllib3的作者,我道歉我们计划有一天将
preload\u content=False
设为默认值。也许不久的某一天()

--

关于
.urlopen
.request
的简要说明:

.urlopen
假定您将负责对传递给请求的任何参数进行编码。在这种情况下,可以使用
.urlopen
,因为您没有向请求传递任何参数,但通常
。请求
将为您完成所有额外的工作,因此更方便


如果有人愿意为此改进我们的文档,我们将不胜感激。:)请将PR发送到,并将自己添加为贡献者

我的靓汤代码在一个环境(我的本地机器)中运行,在另一个环境(ubuntu 14服务器)中返回一个空列表

我已经解决了更改安装的问题。 其他线程中的详细信息:


它显然正在转换为
BeautifulSoup
对象,否则,
soup.title
将引发异常,而不是给您
None
。更好的方法是打印出
type(soup)
。您的代码一无所获,请尝试打印内容。read()您手动构建一个池然后调用它是有原因的吗?@abarnert,我明白了,谢谢。@PadraicCunningham content.read()表示“谢谢”,但当我尝试进一步解析时,我没有得到类似于soup的内容。全部找到吗(True)和soup.get_text(),所以我很困惑。@user3885774:这就是我最后一段所解释的:你可能有一个空的汤,或者只有一个
html
节点和一个空的
头和
体,但这真的不重要;没有有用的数据,那么谁会在乎缺少有用的数据是如何表示的呢?urlib3实际上返回一个文件式