美丽的汤树向后导航

时间:2016-07-28 13:52:42

标签: python html beautifulsoup

Shell screen shot

您好:

我是Python新手,如果这个问题太容易,请提前道歉。我一直在疯狂地寻找答案,但似乎找不到适合我案例的例子。

在运行Beautiful Soup的Python 3中,我尝试将我的html树引用设置为特定的href,然后从下面的url中删除前面的6个数值。

url = 'http://www.eia.gov/dnav/pet/pet_sum_sndw_dcus_nus_w.htm'

我从href标签开始的原因是它是html中唯一保持不变且不再重复的引用。

在我的示例中,我想从href标记开始:

href="./hist/LeafHandler.ashx?n=PET&s=W_EPOOXE_YIR_NUS_MBBLD&f=W"

然后从该标记之前的六个"td=class"标记中查看单个内容:

936, 934, 919,957, 951, 928.

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

文件的格式是多个表,您感兴趣的是第二个表。由于您知道要匹配的href属性的值,因此访问所需部分的一种方法是迭代表行,首先检查href值是一个你想要的。

答案 1 :(得分:0)

首先使用 href 选择锚点,然后找到之前的六个td:

from bs4 import BeautifulSoup
import requests
url = 'http://www.eia.gov/dnav/pet/pet_sum_sndw_dcus_nus_w.htm'
soup = BeautifulSoup(requests.get(url).content,"html.parser")
anchor = soup.select_one("a[href=./hist/LeafHandler.ashx?n=PET&s=W_EPOOXE_YIR_NUS_MBBLD&f=W]")
data = [td.text for td in anchor.find_all_previous("td","DataB", limit=6)]

如果我们运行代码,您可以看到我们从之前的六个td中获取文本:

In [1]: from bs4 import BeautifulSoup
   ...: import requests
   ...: url = 'http://www.eia.gov/dnav/pet/pet_sum_sndw_dcus_nus_w.htm'
   ...: soup = BeautifulSoup(requests.get(url).content,"html.parser")
   ...: anchor = soup.select_one("a[href=./hist/LeafHandler.ashx?n=PET&s=W_EPOOX
   ...: E_YIR_NUS_MBBLD&f=W]")
   ...: data = [td.text for td in anchor.find_all_previous("td","DataB", limit=6
   ...: )]
   ...: 

In [2]: data
Out[2]: ['934', '919', '957', '951', '928', '139']

由于td的 Current2 DataB sdo有两个不同的类,因此我们可以使用锚的父节点td本身:

In [5]: from bs4 import BeautifulSoup
   ...: import requests
   ...: url = 'http://www.eia.gov/dnav/pet/pet_sum_sndw_dcus_nus_w.htm'
   ...: soup = BeautifulSoup(requests.get(url).content,"html.parser")
   ...: anchor_td = soup.find("a", href="./hist/LeafHandler.ashx?n=PET&s=W_EPOOXE_Y
   ...: IR_NUS_MBBLD&f=W").parent
   ...: data = [td.text for td in anchor_td.find_all_previous("td", limit=6)]
   ...: 

In [6]: data
Out[6]: ['936', '934', '919', '957', '951', '928']

现在我们得到了我们想要的东西。

最后,我们可以获取 anchor grandparent ,即主 td 然后使用我们这两个类名的select 选择

href = "./hist/LeafHandler.ashx?n=PET&s=W_EPOOXE_YIR_NUS_MBBLD&f=W"
grandparent = soup.find("a", href=href).parent.parent
data = [td.text for td in grandparent.select("td.Current2,td.DataB")]

再次,数据为我们提供了相同的输出。