2017-03-01 90 views
1

我想scar一个网站。如果只有一个开放和一个关闭窗体,则没有问题 - 标签和数据位于该窗体之间。但是当网站上的数据显示在复选框下时,代码中的数据处于奇怪的位置。有人有同样的问题吗?解析html格式输入标签与美丽的汤

这里是一个基本的例子页面,我想数据:

<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> 
.... 

我需要获取数据:机场,碉堡等(数据)已经在它们的输入数组“检查=‘’” 。 1问题:为了确保我只得到遏制值 第二个问题:如何获取这是通过使用下面的代码

<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

我已经跑了您的COND任何它输出的像这样输入列表:[<输入类=” forminput“disabled =”“id =”ajaxField-20“name =”t_pow_ports:f_p_a:595“type =”checkbox“/>,<...... –

+0

是的,但它不包含我正在查看的数据对于。 – user7400738

回答

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=""/> 
    &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) 

此代码段的输出是:

Airport 
Bunkers 
0

只需设置flag

soup.title.find_all(string=True) 
+0

我只是以列表对象的形式返回标题。 :[“劳埃德名单 - 目录”] – user7400738