我有一个使用urllib
模块访问网站的python脚本,我试图从该html代码中提取网页中的链接。链接的部分看起来像这样:
<form name="signIn" method="POST" id="ap_signin_form" novalidate="novalidate" action="http://toextractHERE.com"
onsubmit="var test1 = apCheckRequiredFields('ap_signin_form', ['ap_email','ap_password']);
return (apValidateEmail('ap_email') && test1);">
我尝试使用以下代码解压缩它:
s = website.read()
a = s[s.index('<form name="signIn" method="POST" id="ap_signin_form" novalidate="novalidate" action="')+len('<form name="signIn" method="POST" id="ap_signin_form" novalidate="novalidate" action="'):s.index("""\n\n\n\n\n\nonsubmit="var test1 = apCheckRequiredFields('ap_signin_form', ['ap_email','ap_password']);""")]
print(a)
但是没有得到链接我得到了这个错误:
Traceback (most recent call last):
File "C:\Users\Ann\Desktop\code.py", line 9, in <module>
a = s[s.index('<form name="signIn" method="POST" id="ap_signin_form" novalidate="novalidate" action="')+len('<form name="signIn" method="POST" id="ap_signin_form" novalidate="novalidate" action="'):s.index("""\n\n\n\n\n\nonsubmit="var test1 = apCheckRequiredFields('ap_signin_form', ['ap_email','ap_password']);""")]
TypeError: Type str doesn't support the buffer API
>>>
我该如何解决这个问题?
答案 0 :(得分:2)
urllib.request
返回 bytes 对象,而非字符串。您尝试在bytes.index()
方法中使用字符串会导致异常。
如果您想将结果视为文本,则需要解码:
charset = website.info().get_param('charset', 'latin1')
s = website.read().decode(charset)
Latin-1是text/*
内容类型的默认值。因为HTML 也表示<meta>
标题中使用的字符集,所以上述方法不可靠。
使用专用的HTML解析器会更好。 BeautifulSoup将从HTML字节串本身检测到正确的字符集:
from bs4 import BeautifulSoup
soup = BeautifulSoup(website.read())
form_action = soup.find('form', id='ap_signin_form')['action']