【发布时间】:2016-06-14 17:22:54
【问题描述】:
我正在尝试用几张桌子抓取一个网站。两个表都没有类或 id,并且该站点确实不使用任何一个,所以我不确定是否有办法让我获取数据。 这是该网站的链接 - 我会发布 html,但它会太长。
我要提取的表从第 310 行开始。
【问题讨论】:
标签: python python-3.x web-scraping beautifulsoup
我正在尝试用几张桌子抓取一个网站。两个表都没有类或 id,并且该站点确实不使用任何一个,所以我不确定是否有办法让我获取数据。 这是该网站的链接 - 我会发布 html,但它会太长。
我要提取的表从第 310 行开始。
【问题讨论】:
标签: python python-3.x web-scraping beautifulsoup
由于这是BeautifulSoup 的具体问题,因此这是一个有效的BeautifulSoup 特定解决方案。这个想法是找到具有SKU# 文本和locate the first table parent 的元素:
import requests
from bs4 import BeautifulSoup
data = requests.get('http://epi.hbsna.com/products/dept.asp?msi=0&sid=6076533CE8C648AE9883BDDBED795B29&dept_id=315&parent_id=0').content
soup = BeautifulSoup(data, "html.parser")
table = soup.find(text="SKU#").find_parent("table")
for row in table.find_all("tr")[1:]:
print([cell.get_text(strip=True) for cell in row.find_all("td")])
打印表格的内容:
['40010001', 'ABA Service Kit', '-', '1-1/4" 10', 'None', '5-1/2"', '0.63', 'Clamp', '42710566']
['40010002', 'ABA Service Kit', '-', '1-1/4" 10', '5/8" RH', '5-1/2"', '0.63', 'Clamp', '42710566']
...
['40010649', 'ABA Service Kit', '-', '1 1/2 - 10', '1.5', '6"', '0.50', 'Strap', '427-10517']
['40050604', 'ABA Service Kit', 'none', '1 1/2" - 10"', '1 1/2" LH', '6"', '0.50', 'Strap', '427-10601']
【讨论】:
您对使用这个xpath 表达式感觉如何?
//*[./text()="SKU#"]/ancestor::table[1]
意思是,“找到第一个文本正好是 SKU# 的元素,然后选择它最近的表祖先。”
您可以通过将表达式作为字符串传递给$x 函数,在浏览器检查器中进行尝试。
请参阅 this answer 以在 beautifulsoup 中使用 xpath。
【讨论】:
beautifulsoup,而且读起来非常清楚! xpath 是一种用于导航 xml 文档的语言,它在大多数编程语言中都有实现。作为您的网络抓取工具包的一部分,值得一试。 :)