使用bs4进行HTML解析

时间:2018-04-02 20:40:19

标签: python beautifulsoup

我正在解析一个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)

网站链接:http://www.fortwiki.com/Battery_Adair

3 个答案:

答案 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)