拆分字符串以提取URL

时间:2014-07-08 16:43:56

标签: python string python-3.x urllib

我有一个使用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
>>> 

我该如何解决这个问题?

1 个答案:

答案 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']