按类查找范围并提取其内容

时间:2017-04-04 07:59:49

标签: python web-scraping beautifulsoup

我想提取快照中给出的特定范围的文本。我无法通过其class属性找到span。我已经附加了要提取的数据的html源(快照)。 有什么建议吗?

import bs4 as bs
import urllib 
sourceUrl='https://www.pakwheels.com/forums/t/planing-a-trip-from-karachi-to-lahore-by-road-in-feb-2017/414115/2'
source=urllib.request.urlopen(sourceUrl).read()
soup=bs.BeautifulSoup(source, 'html.parser')

count=soup.find('span',{'class':'number'})
print(len(count))

见图片:

See the image

3 个答案:

答案 0 :(得分:1)

如果您在浏览器中禁用JavaScript,则可以轻松看到所需的span元素正在消失。 为了获得该元素,可以使用Selenium浏览器之一。

from selenium import webdriver

driver = webdriver.Chrome()
driver.get('https://www.pakwheels.com/forums/t/planing-a-trip-from-karachi-to-lahore-by-road-in-feb-2017/414115/2')
span = driver.find_element_by_xpath('//li[3]/span')
print(span.text)
driver.close()

输出: enter image description here

另一种解决方案 - 在网页源中深入查找所需值(在Chrome浏览器中按Ctrl + U)并使用正则表达式提取范围值。

import re
import requests
r = requests.get(
    'https://www.pakwheels.com/forums/t/planing-a-trip-from-karachi-to-lahore-by-road-in-feb-2017/414115/2')
span = re.search('\"posts_count\":(\d+)', r.text)
print(span.group(1))

输出: enter image description here

答案 1 :(得分:0)

如果您知道如何使用 CSS SELECTORS ,则可以使用:

mySpan = soup.select("span.number")

它将返回对此选择器有效的所有节点的List。 所以mySpan[0]可能包含您需要的内容。然后使用其中一种方法(例如get_text())来获取所需内容。

答案 2 :(得分:0)

首先,您需要解码响应

source=urllib.request.urlopen(sourceUrl).read().decode()

此修复后,您的问题可能会消失