解析页面的所有输入标记

时间:2017-05-22 09:11:32

标签: python beautifulsoup

我试图解析页面中的所有输入标签(type = text):http://demo.testfire.net/feedback.aspx

正如您在上面的网址中看到的,有两种形式。

import bs4 as bs 
import urllib.request
import requests
import webbrowser
import urllib.parse

url = "http://demo.testfire.net/feedback.aspx"

sauce = urllib.request.urlopen(url).read()
soup = bs.BeautifulSoup(sauce,"html.parser")

form = soup.find('form')
inputs = form.find('input', type='text').get('name')
print(inputs)

当我运行上面的代码时,我只得到第一个表单的name属性。即使我使用以下内容进行迭代:

for elements in inputs:
   print(elements.get('name'))

我只得到第一个表单的name属性。如何解析任何页面的所有表单和所有输入,而不管是否。一页中的表格?

如果我使用 soup.find_all(' form')而不是find(表单),我会收到错误消息。上面的代码可能有什么问题?

2 个答案:

答案 0 :(得分:1)

您可以使用此类代码从页面中获取所有input元素。

>>> import requests
>>> from bs4 import BeautifulSoup
>>> url = 'http://demo.testfire.net/feedback.aspx'
>>> page = requests.get(url).text
>>> soup = BeautifulSoup(page, 'lxml')
>>> inputs = soup.findAll('input', attrs={'type': 'text'})
>>> len(inputs)
3
>>> for input in inputs:
...     input.attrs['name']
... 
'txtSearch'
'name'
'email_addr'

但是,我希望您希望所有能够接收表单内部字符串输入的input元素是否已正确标记为是否键入。这部分代码非常不一致(例如,并非所有input元素都有type),在我看来,可能需要解析表的行,然后从中进行选择。 / p>

>>> form = soup.find('form', attrs={'name': 'cmt'})
>>> table = form.find('table')
>>> leftColumns = table.findAll('td', attrs={'align': 'right'})
>>> for column in leftColumns[1:-1]:
...     column.findNextSibling().findChild()
... 
<input name="name" size="25" type="text" value=" "/>
<input name="email_addr" size="25" type="text"/>
<input name="subject" size="25"/>

使用etree可能更容易,因为您可以使用xpath表达式。在这种情况下,我注意到所需的input元素都具有非空size属性。

>>> from lxml import etree
>>> parser = etree.HTMLParser()
>>> tree = etree.fromstring(page, parser=parser)
>>> inputs = tree.xpath('.//form[@name="cmt"]//input[@size and string-length(@size)]')
>>> len(inputs)
3
>>> for input in inputs:
...     input.attrib
...     
{'value': ' ', 'name': 'name', 'size': '25', 'type': 'text'}
{'name': 'email_addr', 'size': '25', 'type': 'text'}
{'name': 'subject', 'size': '25'}

答案 1 :(得分:0)

将您的代码命名为:

import bs4 as bs 
import urllib.request
import requests
import webbrowser
import urllib.parse

url = "http://demo.testfire.net/feedback.aspx"

sauce = urllib.request.urlopen(url).read()
soup = bs.BeautifulSoup(sauce,"html.parser")

form = soup.findAll('form')
for i in form:
   inputs = i.find('input').get('name')
   print(inputs)