0

所以我试图提取一行 html 的值,如下所示:

<input type="hidden" name="_ref_ck" value="41d875b47692bb0211ada153004a663f">

并获得我正在做的价值:

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 的一部分

我的问题是为什么或者是否有一种简单的方法可以使用正则表达式或其他方法来做到这一点,谢谢!

4

1 回答 1

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
于 2013-08-20T05:26:44.217 回答