我正在尝试创建一个网页抓取器,我想使用BeautifulSoup这样做。我安装了BeautifulSoup 4.3.2,因为该网站称它与python 3.x兼容。我用了
pip install beautifulsoup4
安装它。但是当我跑步时
from bs4 import BeautifulSoup
import requests
url = input("Enter a URL (start with www): ")
link = "http://" + url
data = requests.get(link).content
soup = BeautifulSoup(data)
for link in soup.find_all('a'):
print(link.get('href'))
我收到错误消息
Traceback (most recent call last):
File "/Users/user/Desktop/project.py", line 1, in <module>
from bs4 import BeautifulSoup
File "/Library/Frameworks/Python.framework/Versions/3.1/lib/python3.1/site-packages /bs4/__init__.py", line 30, in <module>
from .builder import builder_registry, ParserRejectedMarkup
File "/Library/Frameworks/Python.framework/Versions/3.1/lib/python3.1/site-packages/bs4/builder /__init__.py", line 308, in <module>
from .. import _htmlparser
ImportError: cannot import name _htmlparser
答案 0 :(得分:1)
我认为源文件中可能存在错误,特别是在这里:
File "/Library/Frameworks/Python.framework/Versions/3.1/lib/python3.1/site-packages/bs4/builder /__init__.py", line 308, in <module>
from .. import _htmlparser
在我的安装中,bs4/builder /__init__.py
from . import _htmlparser
您可以在那里修复它,看看bs4是否会成功导入。不确定您安装了哪个版本的bs4,但我的版本是4.3.2,而_htmlparser.py
也是bs4/builder
答案 1 :(得分:1)
刚刚安装了Python 3.x并测试了最新的BS4下载。没工作。但是,可以在这里找到修复:https://github.com/il-vladislav/BeautifulSoup4(GitHub用户Il Vladislav,无论你是谁)。
下载zip,覆盖bs4
下载中的BeautifulSoup
文件夹,然后通过python setup.py install
重新安装。现在就可以使用了,正如你在下面的截图中看到的那样,在完全工作之前出现错误。
<强>代码:强>
from bs4 import BeautifulSoup
import requests
url = input("Enter a URL (start with www): ")
link = "http://" + url
data = requests.get(link).content
soup = BeautifulSoup(data)
for link in soup.find_all('a'):
print(link.get('href'))
<强>截图:强>
发现相关SO主题here,表明BS4 完全与Python 3.x完全兼容(即使在2年后)。
答案 2 :(得分:0)
我刚编辑了bs4/builder/_htmlparser.py
以便
A)未导入HTMLParseError
from html.parser import HTMLParser
B)定义了HTMLParseError类
class HTMLParseError(Exception):
"""Exception raised for all parse errors."""
def __init__(self, msg, position=(None, None)):
assert msg
self.msg = msg
self.lineno = position[0]
self.offset = position[1]
def __str__(self):
result = self.msg
if self.lineno is not None:
result = result + ", at line %d" % self.lineno
if self.offset is not None:
result = result + ", column %d" % (self.offset + 1)
return result
这可能不是最好的,因为不会引发HTMLParserError。但!你的例外将是未被捕获的,无论如何都是未处理的。