将lxml输出传递给BeautifulSoup

时间:2012-12-11 23:33:19

标签: python beautifulsoup lxml

我的离线代码工作正常,但我无法将网页从urllib通过lxml传递到BeautifulSoup。我正在使用urllib进行基本身份验证,然后使用lxml进行解析(使用我们需要抓取的特定页面给出一个很好的结果)然后再使用BeautifulSoup。

#! /usr/bin/python
import urllib.request 
import urllib.error 
from io import StringIO
from bs4 import BeautifulSoup 
from lxml import etree 
from lxml import html 

file = open("sample.html")
doc = file.read()
parser = etree.HTMLParser()
html = etree.parse(StringIO(doc), parser)
result = etree.tostring(html.getroot(), pretty_print=True, method="html")
soup = BeautifulSoup(result)
# working perfectly

有了这个工作,我试图通过urllib提供一个页面:

# attempt 1
page = urllib.request.urlopen(req)
doc = page.read()
# print (doc)
parser = etree.HTMLParser()
html = etree.parse(StringIO(doc), parser)
# TypeError: initial_value must be str or None, not bytes

尝试处理错误消息,我试过了:

# attempt 2
html = etree.parse(bytes.decode(doc), parser)
#OSError: Error reading file

我不知道如何处理OSError,所以我寻求另一种方法。我找到了使用lxml.html而不是lxml.etree的建议,因此下一次尝试是:

attempt 3
page = urllib.request.urlopen(req)
doc = page.read()
# print (doc)
html = html.document_fromstring(doc)
print (html)
# <Element html at 0x140c7e0>
soup = BeautifulSoup(html) # also tried (html, "lxml")
# TypeError: expected string or buffer

这显然给出了某种结构,但是如何将它传递给BeautifulSoup?我的问题是双重的:如何将页面从urllib传递到lxml.etree(如在1中最接近我的工作代码)?或者,如何将lxml.html结构传递给BeautifulSoup(如上所述)?我知道两者都围绕数据类型,但不知道如何处理它们。

python 3.3,lxml 3.0.1,BeautifulSoup 4.我是python的新手。感谢互联网提供代码片段和示例。

1 个答案:

答案 0 :(得分:3)

BeautifulSoup可以使用lxml parser directly,无需使用这些长度。

BeautifulSoup(doc, 'lxml')