美丽的汤从同一div类的第二个孩子刮文本

时间:2017-09-26 23:01:04

标签: python html web-scraping beautifulsoup

我在同一个div类中有两个<tr>个标签。第一个tr标签打印文本就好了。我试图访问容器中的第二个tr标签,但我似乎无法让它工作。另请注意,并非所有容器都有第二个<tr>标记,因此我需要if语句来检查它是否存在。如果是,则从中打印文本。谢谢!

page_soup = soup(page_html, "html.parser")

containers = page_soup.findAll("div",{"class":"right"})

for container in containers:
    print(container.span.text)
    print(container.tr.text)

    if container.nextSiblings('tr')[1]:
        print(container.nextSiblings('tr')[1].text)

1 个答案:

答案 0 :(得分:0)

您可以找到容器中的所有tr元素并检查它们中有多少元素:

for container in containers:
    trs = container("tr")  # same as container.find_all("tr")

    if len(trs) > 1:
         print(trs[1].get_text())

您还可以在一个CSS selector中的每个容器中直接找到第二个tr

for tr in soup.select(".right > tr:nth-of-type(2)"):
    print(tr.get_text())

演示:

from bs4 import BeautifulSoup


data = """
<body>
    <div class="right">
        <tr>container 1 row 1</tr>
        <tr>container 1 row 2</tr>
    </div>
    <div class="right">
        <tr>container 2 row 1</tr>
    </div>
    <div class="right">
        <tr>container 3 row 1</tr>
        <tr>container 3 row 2</tr>
        <tr>container 3 row 3</tr>
    </div>
</body>
"""

soup = BeautifulSoup(data, "html.parser")
for tr in soup.select(".right > tr:nth-of-type(2)"):
    print(tr.get_text())

会打印:

container 1 row 2
container 3 row 2