selenium 删除标记的文本内容,但不删除第一个内的其他标记中的文本

c3frrgcw  于 2022-11-10  发布在  其他
关注(0)|答案(2)|浏览(162)

我需要从每个<tr>的第一个<td>元素中获取文本。但不是所有文本,只有标记<a>内部和任何其他标记外部的文本。我把必要的文本写成了“yyy”/“y”,把不必要的写成了“zzz”

<table>
  <tbody>
    <tr>
      <td>
        <b>zzz</b>
        <a href="#">yyy</a>
        "y"
        <a href="#">yyy</a>
        <sup>zzz</sup>
        <a href="#">yyy</a>
        <a href="#">yyy</a>
        "y"
      </td>
      <td>
        zzzzz
      </td>
    </tr>
  </tbody>
</table>

这是我目前所拥有的

words = []
for tableRows in soup.select("table > tbody > tr"):
  tableData = tableRows.find("td").text
  text = [word.strip() for word in tableData.split(' ')]
  words.append(text)
print(words)

但是这段代码正在解析<td>["zzz", "yyyy", "yyyy", "zzz", "yyyy"]中的所有文本。

g9icjywg

g9icjywg1#

尝试:

from bs4 import BeautifulSoup, Tag, NavigableString

html_doc = """\
<table>
  <tbody>
    <tr>
      <td>
        <b>zzz</b>
        <a href="#">yyy</a>
        "y"
        <a href="#">yyy</a>
        <sup>zzz</sup>
        <a href="#">yyy</a>
        <a href="#">yyy</a>
        "y"
      </td>
      <td>
        zzzzz
      </td>
    </tr>
  </tbody>
</table>"""

soup = BeautifulSoup(html_doc, "html.parser")

for td in soup.select("td:nth-of-type(1)"):
    for c in td.contents:
        if isinstance(c, Tag) and c.name == "a":
            print(c.text.strip())
        elif isinstance(c, NavigableString):
            c = c.strip()
            if c:
                print(c)

打印:

yyy
"y"
yyy
yyy
yyy
"y"
  • soup.select("td:nth-of-type(1)")仅选择第一个<td>
  • 然后我们迭代此<td>.contents
  • if isinstance(c, Tag) and c.name == "a"检查内容是否为Tag,以及Tag的名称是否为<a>
  • if isinstance(c, NavigableString)检查内容是否为纯字符串。
fd3cxomn

fd3cxomn2#

根据您的示例,使用td标记的children。然后选中名为a的子项为None。然后检查是否有子级文本,然后添加。

words = []

for item in soup.select("table > tbody > tr"):
    for child in item.td.children:        
        if child.name=='a' or child.name==None:
           if child.text.strip():
              words.append(child.text.strip())
print(words)

输出:

['yyy', '"y"', 'yyy', 'yyy', 'yyy', '"y"']

相关问题