首页 > 解决方案 > 忽略 td beautifulsoup 中的 N/A 值

问题描述

我想删除同一类的 td 中的 N/A 值

  <td align="left" class="category"> N/A</td>
<td align="left" class="title"> <a href="article-feb-0243.html">Wall Street cool to eBay's profit</a></td>
<td align="left" class="category"> technology</td>
<td align="left" class="title"> <a href="article-feb-2017.html">Warnings about junk mail deluge</a></td>
<td align="left" class="category"> technology</td>
<td align="left" class="title"> <a href="article-feb-2660.html">Web radio takes Spanish rap global</a></td>
<td align="left" class="category"> sport</td>

我想同时抓取类别和标题,但在类别中要忽略 N/A 值

for td in parsed_html.body.findAll('td',{"class":lambda class_: class_ in ("category","title")}):
                print(td)
                category=td.parent.find("td",attrs={"class":"category"}).text

                if(not td.parent.find("i")):
                    url=td.parent.find("a")["href"]

我已经尝试将字符串匹配到 N/A 但它不起作用

标签: pythonweb-scrapingbeautifulsoup

解决方案


首先,您不必使用自定义函数来匹配多个类。您可以将不同的类作为列表传递。

其次,有两种方法可以让你得到你想要的。N/A您可以在遍历所有标签时简单地检查文本是否包含,<td>如果存在则跳过标签。

html = '''
<td align="left" class="category"> N/A</td>
<td align="left" class="title"> <a href="article-feb-0243.html">Wall Street cool to eBay's profit</a></td>
<td align="left" class="category"> technology</td>
<td align="left" class="title"> <a href="article-feb-2017.html">Warnings about junk mail deluge</a></td>
<td align="left" class="category"> technology</td>
<td align="left" class="title"> <a href="article-feb-2660.html">Web radio takes Spanish rap global</a></td>
<td align="left" class="category"> sport</td>'''

soup = BeautifulSoup(html, 'lxml')
for td in soup.find_all('td', class_=['category', 'title']):
    if 'N/A' in td.text:
        continue
    print(td)

输出:

<td align="left" class="title"> <a href="article-feb-0243.html">Wall Street cool to eBay's profit</a></td>
<td align="left" class="category"> technology</td>
<td align="left" class="title"> <a href="article-feb-2017.html">Warnings about junk mail deluge</a></td>
<td align="left" class="category"> technology</td>
<td align="left" class="title"> <a href="article-feb-2660.html">Web radio takes Spanish rap global</a></td>
<td align="left" class="category"> sport</td>

您也可以使用自定义函数来执行此操作。

for td in soup.find_all(lambda tag: tag.name == 'td' and tag['class'][0] in ('category', 'title') and 'N/A' not in tag.text):
    print(td)

推荐阅读