所以我试图提取一行html的值,如下所示:
<input type="hidden" name="_ref_ck" value="41d875b47692bb0211ada153004a663f">
并获得值im:
self.ref = soup.find("input",{"name":"_ref_ck"}).get("value")
它的工作正常,但我给了我的一个朋友测试程序,他得到这样的错误:
Traceback (most recent call last):
File "C:\Users\Daniel\AppData\Local\Temp\Rar$DI85.192\Invent Manager.py", line 262, in onOK
self.main = GUI(None, -1, 'Inventory Manager')
File "C:\Users\Daniel\AppData\Local\Temp\Rar$DI85.192\Invent Manager.py", line 284, in __init__
self.inv.Login(log.user)
File "C:\Users\Daniel\AppData\Local\Temp\Rar$DI85.192\Invent Manager.py", line 34, in Login
self.get_ref_ck()
File "C:\Users\Daniel\AppData\Local\Temp\Rar$DI85.192\Invent Manager.py", line 43, in get_ref_ck
self.ref = soup.find('input',{'name':'_ref_ck'}).get("value")
AttributeError: 'NoneType' object has no attribute 'get'
这意味着beautifulSoup由于某种原因返回NoneType
所以我告诉他把请求返回的HTML发给我,然后我告诉他给我汤,它只有页面的顶部,我不知道为什么
这意味着BS只返回其接收的部分HTML
我的问题是为什么或者如果有一种简单的方法我可以使用正则表达式或其他感谢!
答案 0 :(得分:1)
这是一个快速基于pyparsing的解决方案演练:
从pyparsing
导入HTML解析助手>>> from pyparsing import makeHTMLTags, withAttribute
定义你想要的标签表达式(makeHTMLTags
返回开始和结束标签匹配表达式,你只需要一个起始表达式,所以我们只取第0个返回值。)
>>> inputTag = makeHTMLTags("input")[0]
只想要具有name
属性= "_ref_ck"
的输入标记,使用withAttribute
进行此过滤
>>> inputTag.setParseAction(withAttribute(name="_ref_ck"))
现在定义您的示例输入,并使用inputTag
表达式定义来搜索匹配项。
>>> html = '''<input type="hidden" name="_ref_ck" value="41d875b47692bb0211ada153004a663f">'''
>>> tagdata = inputTag.searchString(html)[0]
调用tagdata.dump()
以查看所有已解析的令牌和可用的命名结果。
>>> print (tagdata.dump())
['input', ['type', 'hidden'], ['name', '_ref_ck'], ['value', '41d875b47692bb0211ada153004a663f'], False]
- empty: False
- name: _ref_ck
- startInput: ['input', ['type', 'hidden'], ['name', '_ref_ck'], ['value', '41d875b47692bb0211ada153004a663f'], False]
- empty: False
- name: _ref_ck
- tag: input
- type: hidden
- value: 41d875b47692bb0211ada153004a663f
- tag: input
- type: hidden
- value: 41d875b47692bb0211ada153004a663f
使用tagdata.value
获取value
属性:
>>> print (tagdata.value)
41d875b47692bb0211ada153004a663f