문제

내 코드를 다시 확인하고 웹 데이터를 Beautiful Soup에 전달하기 위해 URL을 여는 것과 비슷한 작업을 살펴봤습니다. 어떤 이유에서인지 내 코드는 올바른 형식임에도 불구하고 아무 것도 반환하지 않습니다.

>>> 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...

표시된 대로 urlopen()이 변수 내용에 의해 캡처된 HTTP 응답을 반환한다는 것이 분명합니다. 응답 상태를 읽을 수 있다는 것은 의미가 있지만 Beautiful Soup에 전달된 후에는 웹 데이터가 변환되지 않습니다. Beautiful Soup 개체(가변 수프)로 변환합니다.내가 몇 가지 태그와 텍스트를 읽으려고 시도한 것을 볼 수 있습니다. get_text()는 빈 목록을 반환합니다. 이것은 이상합니다.

이상하게도 content.data를 통해 웹 데이터에 액세스하면 데이터가 표시되지만 Beautiful Soup을 사용하여 구문 분석할 수 없기 때문에 유용하지 않습니다.내 문제는 무엇입니까?감사해요.

도움이 되었습니까?

해결책

페이지를 긁으려면 requests가 필요로하는 내용을 얻습니다.

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'
.

다른 팁

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 신체 페이로드가 아닌 객체.일반적으로 괜찮을 것입니다. 왜냐하면 response 객체는 파일류 객체입니다. 제외하고 이 경우 urllib3은 이미 모든 응답을 소비하고 이를 구문 분석하므로 더 이상 할 일이 없습니다. .read().이는 이미 읽은 파일 포인터를 전달하는 것과 같습니다. .data 반면에 이미 읽은 데이터에 액세스합니다.

urllib3 응답 객체를 파일류 객체로 사용하려면 다음과 같이 콘텐츠 미리 로드를 비활성화해야 합니다.

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_content=False 언젠가는 기본값.아마도 조만간(여기서 문제를 열었습니다.).

--

에 대한 간단한 참고 사항 .urlopen.request:

.urlopen 요청에 전달된 모든 매개변수의 인코딩을 처리한다고 가정합니다.이런 경우에는 사용해도 괜찮습니다 .urlopen 요청에 매개변수를 전달하지 않지만 일반적으로 .request 귀하를 위해 모든 추가 작업을 수행하므로 더 편리합니다.

이 효과를 위해 문서를 개선하려는 사람이 있다면 크게 감사하겠습니다.:) PR을 보내주세요 https://github.com/shazow/urllib3 그리고 자신을 기여자로 추가하세요!

표시된 것처럼 urlopen()이 content 변수에 의해 캡처된 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''

이를 통해 다음이 분명해질 것입니다. BeautifulSoup 여기서 문제는 아닙니다.그러나 계속해서 :

... 하지만 Beautiful Soup으로 전달된 후에는 웹 데이터가 Beautiful Soup 객체(변수 수프)로 변환되지 않습니다.

네, 그렇습니다.사실 그 soup.title 너에게 줬다 None 키우는 대신 AttributeError 꽤 좋은 증거이지만 직접 테스트할 수 있습니다.

>>> type(soup)
bs4.BeautifulSoup

그건 확실히 BeautifulSoup 물체.

통과할 때 BeautifulSoup 빈 문자열, 정확히 무엇을 돌려받게 될지는 내부에서 사용하는 파서에 따라 달라집니다.Python 3.x stdlib에 의존하는 경우 얻을 수 있는 것은 다음과 같습니다. html 비어있는 노드 head, 및 비어 있음 body, 그리고 다른 것은 없습니다.그래서, 당신이 검색할 때 title 노드가 하나도 없고, 당신은 얻습니다 None.


그렇다면 이 문제를 어떻게 해결합니까?

처럼 문서 "요청을하기 위해 가장 낮은 레벨 호출을 사용하므로 모든 원시 세부 사항을 지정해야합니다." 그 원시 세부 사항은 무엇입니까?솔직히, 아직 모른다면 이 방법을 사용해서는 안 됩니다. 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.'

나의 아름다운 수프 코드는 한 환경 (로컬 컴퓨터)에서 일하고 다른 하나의 빈 목록을 반환했습니다 (Ubuntu 14 서버).

나는 내 문제를 해결했다. 다른 쓰레드의 세부 사항 :

HTML 아름다운 수프와 함께 구문 분석 빈 목록 / P>

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top