我正试图躲过一个网站。如果只有一个开口和一个结束表格没有问题 - 标签和数据介于其间。但是当网站上的数据显示在复选框下时,代码中的数据处于奇怪的位置。有没有人有同样的问题?
以下是我想要数据的基本示例网页:
<div class="label"></div>
<input disabled="" type="checkbox" name="t_pow_ports:f_p_a:3486" class="forminput" id="ajaxField-76" checked="">
Airport
<div class="label"></div>
<input disabled="" type="checkbox" name="t_pow_ports:f_p_b:3486" checked="" class="forminput" id="ajaxField-77">
Bunkers
<div class="label"></div>
<input disabled="" type="checkbox" name="t_pow_ports:f_p_c:3486" class="forminput" id="ajaxField-78">
Containers
<div class="label"></div>
<input disabled="" type="checkbox" name="t_pow_ports:f_p_l:3486" class="forminput" id="ajaxField-79">
Cruise
<div class="label"></div>
....
我需要获取数据:Airport,Bunkers等(数据)在输入数组中有'checked =“”'。 第一个问题:确保我只获得检查值 第二个问题:如何获取介于
之间的数据<div>..</div><input...> data <div>...</div>
使用以下代码:
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"})
我得到以下格式:
<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>
所以,如果我使用以下代码:
abc = all[0].find_all("input", {"class":"forminput"},"checked")
我没有得到任何数据:
<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"/>,
....
有没有人知道解决这个问题的方法?
答案 0 :(得分:1)
在检查输入后,您需要使用navigableString来获取下一个兄弟。
尝试以下方法:
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=""/>
Airport
<div class="label"></div>
<input disabled="" type="checkbox" name="t_pow_ports:f_p_b:3486" checked="" class="forminput" id="ajaxField-77"/>
Bunkers
<div class="label"></div>
<input disabled="" type="checkbox" name="t_pow_ports:f_p_c:3486" class="forminput" id="ajaxField-78"/>
Containers
<div class="label"></div>
<input disabled="" type="checkbox" name="t_pow_ports:f_p_l:3486" class="forminput" id="ajaxField-79"/>
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)
此代码段的输出为:
Airport
Bunkers
答案 1 :(得分:0)
只需设置flag
即可soup.title.find_all(string=True)