如何在'th'语句中按关键字抓取表格

时间:2019-07-15 15:19:21

标签: python html web-scraping beautifulsoup

我想根据嵌套在“ tr”中的“ th”元素的关键字来抓取一个表格。原因是表格会因内容顺序而异,但关键字将保持不变。我想在“ th”文本等于“ Product Number”时抓取表格并检索“ td”文本。该表按“ tr”元素排序。我已经接近但不正确。

URL-https://www.amazon.com/dp/B07G5MZNJ4

我尝试了以下操作,它通过在表的第一个“ tr”中提供第一个“ td”的文本来工作。我想知道当'th'='Part Number'返回'td'文本时在哪里插入“ find'tr”这样的注释,'th'和'td'嵌套在'tr'下

 try:
   table = soup.find('table', attrs={'id':'product-specification-table'})
   mfg1 = table.find('tr')
   MFG_NO = mfg1.find('td').text.strip()       

 except:
    pass

当'th'包含'Part Number'时,我希望文本为'td'。谢谢!

2 个答案:

答案 0 :(得分:1)

使用正则表达式查找文本,然后使用find_next('td')标签。

from bs4 import BeautifulSoup
import requests
import re
data=requests.get('https://www.amazon.com/dp/B07G5MZNJ4').text
soup=BeautifulSoup(data,'html.parser')
table = soup.find('table', attrs={'id':'product-specification-table'})
item=table.find('th',text=re.compile('Part Number'))
MFG_NO=item.find_next('td').text
print(MFG_NO.strip())

输出:

PV-923/1

答案 1 :(得分:1)

我的偏好是使用:包含bs4 4.7.1,然后使用combinator获取下一个兄弟td

import requests
from bs4 import BeautifulSoup as bs

r = requests.get('https://www.amazon.com/dp/B07G5MZNJ4/?tag=stackoverfl08-20', headers = {'User-Agent':'Mozilla/5.0'})
soup = bs(r.content, 'lxml')

if soup.select_one('title').text == 'Robot Check':
    print('bad luck')
else:
    part_number = soup.select_one('th:contains("Part Number") + td')
    if part_number is None:
        part_number = 'Not found'
    else:
        part_number = part_number.text.strip()
    print(part_number)