【问题标题】:BeautifulSoup: Can't find Tag with text it containsBeautifulSoup:找不到包含文本的标签
【发布时间】:2019-09-20 03:38:19
【问题描述】:

我在使用其包含在以下页面上的文本查找标签时遇到了麻烦: Link to web page

我正在尝试使用以下代码查找彭博和路透社代码。 我尝试使用 cssSelector:

css_selector = 'tr:has(> td:contains("Bloomberg Code"))'
my_tag: Tag = my_soup.select_one(css_selector)

使用我试过的 find:

my_tag = my_soup.find(lambda t: t.Tag == 'td' and re.findall('Bloomberg Code', t.text, flags=re.I))

它们都返回了大量的 Html 代码,这些代码确实以标签“tr”开头,但与我期望的不匹配:

<tr>
    <td style="padding-top:5px">- Bloomberg Code : </td>
    <td style="padding-left:10px;padding-top:5px" align="left">&nbsp;FLTR:ID</td>
</tr>

我认为问题可能在于 Beautifulsoup 将其视为可导航字符串,但是当我检查为 my_tag 找到的结果类型时,它显示:class 'bs4.element.Tag'

感谢您的帮助 最好的

【问题讨论】:

    标签: python web-scraping beautifulsoup css-selectors


    【解决方案1】:

    您需要一个 User-Agent 标头,并且需要包含搜索词的 td 的相邻兄弟 td

    from bs4 import BeautifulSoup as bs
    import requests
    
    search_strings = ['Bloomberg Code :',' Reuters Code :']
    r = requests.get('https://www.marketscreener.com/FLUTTER-ENTERTAINMENT-PLC-59029817/company/', headers = {'User-Agent':'Mozilla/5.0'})
    soup = bs(r.content, 'lxml')
    
    for search_string in search_strings:
        node = soup.select_one(f'td:contains("{search_string}") + td')
        if node is None:
            print(f'{search_string} not found')
        else:
            print(node.text)
    

    【讨论】:

    • tx 非常感谢使用 css_selector。我刚从这些开始,我想知道“'td:contains("{search_string}") + td'”前面的“f”是什么意思。以及最后的“+ td”,您介意解释一下吗?我使用的是标题,但下次会提到,因为我知道可能是机器人问题。再次发送
    • 嗨,f 代表f strings / 也代表this; + 是css adjacent sibling combinator
    猜你喜欢
    • 2010-10-26
    • 1970-01-01
    • 2021-06-11
    • 2020-06-04
    • 1970-01-01
    • 1970-01-01
    • 2013-10-09
    • 2016-11-24
    相关资源
    最近更新 更多