使用BeautifulSoup对表单进行处理

时间:2015-10-27 11:58:52

标签: python web-scraping beautifulsoup

在开始学习 Python 之后,我决定写一个网页抓取来查找给定网站中的公寓。这需要使用标准问题填写表单(例如citymaxpriceminnumber of rooms等。

目标是设定我在表格中感兴趣的价值观,并对结果进行预先处理。

在开始分析html源代码后,我发现Internet站点有两类Tabs

<option selected="selected" value="cq144552099594975_tab1" class="tab-trigger">Appartment</option>
<option value="cq144552099594975_tab2" class="tab-trigger">Office</option>

<section class="tab" id="cq144552099594975_tab1">
  <form class="form">
    ...
  </form>
</section>

<section style="display: none;" class="tab" id="cq144552099594975_tab2">
  <form class="form">
    ...
  </form>
</section>

从查看html源代码有两个

<form class="form">

到目前为止,我能够使用

获取第一个类表单的html部分
from urllib.request import urlopen
from bs4 import BeautifulSoup

bsObj = BeautifulSoup(html.read(), 'lxml' )      

form = bsObj.body.form

我如何调整我的代码以便能够在两个表单类之间进行迭代? 有没有办法打印BeautifulSoup对象(bsObj)的结构树?

1 个答案:

答案 0 :(得分:1)

对于表单迭代,您可以这样做:

for f in bsObj.body.find_all('form'):
    # All forms in the html
    if 'class' in f and f['class'] == 'form':
        print(f)  # All forms with class="form"

至于打印结构,BS对象有.children和.descendants属性,可以像这样使用:

# Print DIRECT children of body
for c in bsObj.body.children:
    print(c)

# Print ALL children of body
for d in bsObj.body.descendants:
    print(d)

如果你想要一些快速打印进行调试,你也可以像这样使用.prettify()方法:

print(bsObj.body.form.prettify())