2017-03-01 111 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