为什么BeautifulSoup和lxml不起作用?

时间:2015-06-26 14:06:48

标签: python request html-parsing response

我使用mechanize库登录网站。我检查过,效果很好。但问题是我无法将response.read()BeautifulSoup和' lxml'一起使用。

#BeautifulSoup
response = browser.open(url)
source = response.read()
soup = BeautifulSoup(source)  #source.txt doesn't work either
for link in soup.findAll('a', {'class':'someClass'}):
    some_list.add(link)

这不起作用,实际上找不到任何标签。当我使用requests.get(url)时,它运作良好。

#lxml->html
response = browser.open(url)
source = response.read()
tree = html.fromstring(source)  #souce.txt doesn't work either
print tree.text
like_pages = buyers = tree.xpath('//a[@class="UFINoWrap"]')  #/text() doesn't work either
print like_pages

不打印任何东西。我知道返回类型response存在问题,因为它与requests.open()配合得很好。我能做什么?您能否提供示例代码,其中response.read()在html解析中使用?

顺便说一下,responserequests个对象之间的区别是什么?

谢谢!

1 个答案:

答案 0 :(得分:0)

我找到了解决方案。这是因为mechanize.browser是模拟浏览器,它只获得原始html。我想要抓取的页面在JavaScript的帮助下添加了类标记,因此这些类不在原始html上。最好的选择是使用webdriver。我使用Selenium for Python。这是代码:

from selenium import webdriver

profile = webdriver.FirefoxProfile()
profile.set_preference('network.http.phishy-userpass-length', 255)
driver = webdriver.Firefox(firefox_profile=profile)

driver.get(url)
list = driver.find_elements_by_xpath('//a[@class="someClass"]')

注意:您需要安装Firefox。或者,您可以根据要使用的浏览器选择其他配置文件。

  

请求是Web客户端发送到服务器的详细信息,其中包含客户端需要的URL,要使用的http动词(get / post等)的详细信息,如果您要提交表单,请求通常包含数据你把它放在表格中。   响应是Web服务器在回复客户端请求时发回的内容。响应有一个状态代码,指示请求是否成功(代码200通常是在没有问题的情况下,或者是错误代码,如404或500)。响应通常包含数据,如页面中的html或jpeg中的二进制数据。响应还有标题,提供有关响应中的数据的更多信息(例如,“Content-Type”标题,说明数据的格式)。

引用@ davidbuxton对此 link 的回答。

祝你好运!