您好:
我是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.
提前感谢您的帮助。
答案 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")]
再次,数据为我们提供了相同的输出。