首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用Beautiful Soup解析html表单输入标签

用Beautiful Soup解析html表单输入标签
EN

Stack Overflow用户
提问于 2017-03-01 22:40:46
回答 2查看 1.5K关注 0票数 1

我正在尝试浏览一个网站。如果只有一个开始和一个结束的表单标签,并且数据在这两者之间,这是没有问题的。但是,当网站上的数据显示在复选框下时,代码中的数据处于奇怪的位置。有没有人有同样的问题?

这是一个基本的示例网页,我需要其中的数据:

代码语言:javascript
运行
复制
<div class="label"></div>
<input disabled="" type="checkbox" name="t_pow_ports:f_p_a:3486" class="forminput" id="ajaxField-76" checked="">
&nbsp;&nbsp;Airport
<div class="label"></div>
<input disabled="" type="checkbox" name="t_pow_ports:f_p_b:3486" checked="" class="forminput" id="ajaxField-77">
&nbsp;&nbsp;Bunkers
<div class="label"></div>
<input disabled="" type="checkbox" name="t_pow_ports:f_p_c:3486" class="forminput" id="ajaxField-78">
&nbsp;&nbsp;Containers
<div class="label"></div>
<input disabled="" type="checkbox" name="t_pow_ports:f_p_l:3486" class="forminput" id="ajaxField-79">
&nbsp;&nbsp;Cruise
<div class="label"></div>
....

我需要获取数据:机场、燃料库等(数据),它们的输入数组中有'checked =“”。第一个问题:为了确保我只得到检查值第二个问题:如何获取介于

代码语言:javascript
运行
复制
<div>..</div><input...> data <div>...</div> 

通过使用以下代码:

代码语言:javascript
运行
复制
import requests
import bs4
from bs4 import BeautifulSoup
import pandas

r = requests.get("http://directories.lloydslist.com/?p=1635")
c = r.content 
soup = BeautifulSoup(c, "html.parser")
print(soup.prettify())
all = soup.find_all("div",{"id":"section-1785-body"},{"class":"sectionbody"})

我得到的格式如下:

代码语言:javascript
运行
复制
<div class="label"></div>
<input checked="" class="forminput" disabled="" id="ajaxField-115"   name="t_pow_ports:f_p_a:5779" type="checkbox"/>  
Airport
<div class="label"></div>
<input checked="" class="forminput" disabled="" id="ajaxField-116" name="t_pow_ports:f_p_b:5779" type="checkbox"/>  
Bunkers
<div class="label"></div>
.....
....
<input checked="" class="forminput" disabled="" id="ajaxField-119"      name="t_pow_ports:f_p_y:5779" type="checkbox"/>  Dry Bulk
<div class="label"></div></div>

因此,如果我使用以下代码:

代码语言:javascript
运行
复制
abc = all[0].find_all("input", {"class":"forminput"},"checked")

我没有得到任何数据:

代码语言:javascript
运行
复制
<input class="forminput" disabled="" id="ajaxField-20"    name="t_pow_ports:f_p_a:595" type="checkbox"/>,
<input class="forminput" disabled="" id="ajaxField-21" name="t_pow_ports:f_p_b:595" type="checkbox"/>,
 <input class="forminput" disabled="" id="ajaxField-22" name="t_pow_ports:f_p_c:595" type="checkbox"/>,
....

有谁知道解决这个问题的方法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-01 23:06:59

您需要使用navigableString来获取检查输入之后的下一个同级。

尝试以下操作:

代码语言:javascript
运行
复制
from bs4 import BeautifulSoup as Soup

html_str = """
<div>
    <div class="label"></div>
    <input disabled="" type="checkbox" name="t_pow_ports:f_p_a:3486" class="forminput" id="ajaxField-76" checked=""/>
    &nbsp;&nbsp;Airport

    <div class="label"></div>
    <input disabled="" type="checkbox" name="t_pow_ports:f_p_b:3486" checked="" class="forminput" id="ajaxField-77"/>
    &nbsp;&nbsp;Bunkers

    <div class="label"></div>
    <input disabled="" type="checkbox" name="t_pow_ports:f_p_c:3486" class="forminput" id="ajaxField-78"/>
    &nbsp;&nbsp;Containers

    <div class="label"></div>
    <input disabled="" type="checkbox" name="t_pow_ports:f_p_l:3486" class="forminput" id="ajaxField-79"/>
    &nbsp;&nbsp;Cruise

    <div class="label"></div>
</div>
"""

soup = Soup(html_str, "html.parser")

forminput = soup.find_all("input", {"class":"forminput"})
for item in forminput:
    if item.get('checked') is not None:
        # now work with navigable string! be careful for empty lines
        name = item.next_sibling.strip()
        print(name)

此代码段的输出为:

代码语言:javascript
运行
复制
Airport
Bunkers
票数 1
EN

Stack Overflow用户

发布于 2017-03-01 22:54:38

只需设置flag即可

代码语言:javascript
运行
复制
soup.title.find_all(string=True)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42534592

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档