簡體   English   中英

使用 BeautifulSoup 使用它包含的文本查找標簽

[英]Find a tag using text it contains using BeautifulSoup

我正在嘗試抓取此頁面的某些部分: https ://markets.businessinsider.com/stocks/bp-stock 使用 BeautifulSoup 搜索包含在 h2 表格標題中的一些文本

當我做:

data_table = soup.find('h2', text=re.compile('RELATED STOCKS')).find_parent('div').find('table')

它正確地得到了我想要的桌子。

當我嘗試使用類似的行獲取表“分析師意見”時,它返回無:

data_table = soup.find('h2', text=re.compile('ANALYST OPINIONS')).find_parent('div').find('table')

我猜 html 代碼中可能有一些特殊字符,它提供了按預期運行的功能。 我也試過這個:

data_table = soup.find('h2', text=re.compile('.*?STOCK.*?INFORMATION.*?', re.DOTALL))

沒有成功。

我想獲得包含這一位文本“分析師意見”的表格,而無需查找所有表格,而是通過檢查是否包含我請求的文本。

任何想法都將受到高度贊賞。 最好的事物

您可以使用 CSS 選擇器來定位<table>

import requests
from bs4 import BeautifulSoup

url = 'https://markets.businessinsider.com/stocks/bp-stock '

soup = BeautifulSoup(requests.get(url).text, 'lxml')

table = soup.select_one('div:has(> h2:contains("Analyst Opinions")) table')

for tr in table.select('tr'):
    print(tr.get_text(strip=True, separator=' '))

印刷:

2/26/2018 BP Outperform RBC Capital Markets
9/22/2017 BP Outperform BMO Capital Markets

在此處詳細了解 CSS 選擇器。


編輯:對於 canse-insensitive 方法,您可以將bs4 API 與正則表達式一起使用(注意flags=re.I )。 這相當於上面的.select()方法:

import re
import requests
from bs4 import BeautifulSoup

url = 'https://markets.businessinsider.com/stocks/bp-stock '

soup = BeautifulSoup(requests.get(url).text, 'lxml')

h2 = soup.find(lambda t: t.name=='h2' and re.findall('analyst opinions', t.text, flags=re.I))
table = h2.find_parent('div').find('table')

for tr in table.select('tr'):
    print(tr.get_text(strip=True, separator=' '))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM