我正在解析一个HTMl页面并且很难弄清楚如何在没有类或id的情况下拉出某个'p'标签。我试图用lat和long来达到'p'的标记。这是我目前的代码:
import bs4
from urllib import urlopen as uReq #this opens the URL
from bs4 import BeautifulSoup as soup #parses/cuts the html
my_url = 'http://www.fortwiki.com/Battery_Adair'
print(my_url)
uClient = uReq(my_url) #opens the HTML and stores it in uClients
page_html = uClient.read() # reads the URL
uClient.close() # closes the URL
page_soup = soup(page_html, "html.parser") #parses/cuts the HTML
containers = page_soup.find_all("table")
for container in containers:
title = container.tr.p.b.text.strip()
history = container.tr.p.text.strip()
lat_long = container.tr.table
print(title)
print(history)
print(lat_long)
答案 0 :(得分:3)
您要查找的<p>
标记在文档中非常常见,并且没有任何唯一属性,因此我们无法直接选择它。
一种可能的解决方案是按索引选择标签,如bloopiebloopie的answer。
但是,除非您知道标签的确切位置,否则无法使用。
另一种可能的解决方案是找到具有区别属性/文本的相邻标签,并选择与之相关的标签。
在这种情况下,我们可以找到包含文字的上一个标记:“地图和图像”,并使用find_next
选择下一个标记。
import requests
from bs4 import BeautifulSoup
url = 'http://www.fortwiki.com/Battery_Adair'
r = requests.get(url)
soup = BeautifulSoup(r.text, "html.parser")
b = soup.find('b', text='Maps & Images')
if b:
lat_long = b.find_next().text
此方法应在任何带有地图的www.fortwiki.com页面中找到坐标数据。
答案 1 :(得分:2)
您可以使用re
来匹配代码中的部分文字。
import re
import requests
from bs4 import BeautifulSoup
url = 'http://www.fortwiki.com/Battery_Adair'
r = requests.get(url)
soup = BeautifulSoup(r.text, "html.parser")
lat_long = soup.find('p', text=re.compile('Lat:\s\d+\.\d+\sLong:')).text
print(lat_long)
# Lat: 24.5477038 Long: -81.8104541
答案 2 :(得分:0)
我不确定你想要什么,但这对我有用。可能有更好的方法。我是python的新手
soup = BeautifulSoup(requests.get("http://www.fortwiki.com/Battery_Adair").content, "html.parser")
x = soup.find("div", id="mw-content-text").find("table").find_all("p")[8]
x = x.get_text()
x = x.split("Long:")
lat = x[0].split(" ")[1]
long = x[1]
print("LAT = " + lat)
print("LNG = " + long)