2016-08-23 151 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选择器的语法,它适用于所有程序 –

相关问题