2016-08-23 179 views
5

我在HTML這些元素我想分析:選擇元素相同的第一個

<td class="line"> GARBAGE </td> 
<td class="line text"> I WANT THAT </td> 
<td class="line heading"> I WANT THAT </td> 
<td class="line"> GARBAGE </td> 

我怎樣才能讓一個CSS選擇器,選擇帶有屬性的班線元素類別別的東西(可以是標題,文本或其他任何東西)但不屬性類行嗎?

我曾嘗試:

td[class=line.*] 
td.line.* 
td[class^=line.] 

編輯

我使用Python和BeautifulSoup:

url = 'http://www.somewebsite' 
res = requests.get(url) 
res.raise_for_status() 
DicoSoup = bs4.BeautifulSoup(res.text, "lxml") 
elems = DicoSoup.select('body div#someid tr td.line') 

我期待到修改的最後一塊,即td.line喜歡的東西td.line.whateverotherclass(但不是td.line單獨,否則我的選擇器就已經足夠)

回答

3

什麼@BoltClock suggested一般是CSS選擇器來解決這個問題的正確道路。唯一的問題是,BeautifulSoup supports a limited number of CSS selectors。例如,not() selector is :not(.supported) at the moment

你可以用一個「開始,以」選擇變通辦法來檢查類line後面加一個空格開始(這是很脆弱的,但工程上的樣本數據):

for td in soup.select("td[class^='line ']"): 
    print(td.get_text(strip=True)) 

或者,你可以解決它使用find_all()並具有searching function檢查class屬性有line和其他一些類:

from bs4 import BeautifulSoup 

data = """ 
<table> 
    <tr> 
     <td class="line"> GARBAGE </td> 
     <td class="line text"> I WANT THAT </td> 
     <td class="line heading"> I WANT THAT </td> 
     <td class="line"> GARBAGE </td> 
    </tr> 
</table>""" 
soup = BeautifulSoup(data, 'html.parser') 

for td in soup.find_all(lambda tag: tag and tag.name == "td" and 
            "class" in tag.attrs and "line" in tag["class"] and 
            len(tag["class"]) > 1): 
    print(td.get_text(strip=True)) 

打印:

I WANT THAT 
I WANT THAT 
+0

太棒了!這是一個很好的解決方法。謝謝! –

+0

我應該寫什麼lambda函數來獲取子標記,方法與以下代碼行相同:DicoSoup.select('body div#somed tr td') –

+0

@MthClv您可以說,首先找到父'div' ,例如:'div = soup.select_one(「body div#somed」)',然後在使用搜索功能搜索'td'元素時使用'div'變量而不是'soup'?有點像上下文特定的搜索。 – alecxe

0

您可以爲類選擇器鏈接CSS類。

.line { 
 
    color: green; 
 
} 
 
.line.text { 
 
    color: red; 
 
} 
 
.line.heading { 
 
    color: blue; 
 
}
<p class="line">GARBAGE</p> 
 
<p class="line text">I WANT THAT</p> 
 
<p class="line heading">I WANT THAT</p> 
 
<p class="line">GARBAGE</p>

+0

我認爲重點是* *一個*選擇器...不是多個。我不知道這是可能的,雖然 –

+0

正確的保利,我正在尋找一種方法將其包裹在一個選擇器中;像 td.line.whateverOtherClass –

+0

我很抱歉,我應該提到:我想用Python庫做BeautifulSoup,我以爲我只是錯過了一段關於CSS選擇器的語法,它適用於所有程序 –

相關問題