我试图解析页面中的所有输入标签(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(表单),我会收到错误消息。上面的代码可能有什么问题?
答案 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)