python - 使用 python 和 BeautifulSoup 抓取不完整的标签

标签 python beautifulsoup urllib2 mechanize

试图抓取本网站 url使用 urllib2、 Mechanize 和 BeautifulSoup。当通过浏览器呈现并使用 FireBug 查看时,我们可以看到类 progress__supporters 和 progress_goal 的 div 标签,如下所示。

Fire Bug View

但是当我们使用 urllib2.open/mechanize/selenium 查看网页时,这些标签是不可用的。下面是示例代码

    def parse_petition(self,petition):
        mb = mechanize.Browser()
        mb.addheaders = [('User-agent',
                      'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]
        mb.set_handle_robots(False)
        data = mb.open(petition,timeout=50).read()
        soup = BeautifulSoup(data)
        print soup.find('progress')

我们使用上面的代码得到以下输出。
<div class='progress'>
</div>

一个原因可能是因为带有“progress__goal”和“progress__support”类的 div 标签不完整。我如何才能像源代码一样阅读这些页面并使用 BeautifulSoup 抓取值?

最佳答案

该页面使用 JavaScript 向不同的 URL 发出 POST 请求。您可以直接访问此 URL 并返回 JSON。 JSON 包含您想要的数据,例如

import mechanize
import urllib
import json
url = "http://www.thepetitionsite.com/servlets/petitions/signatures.php"
params = {'petitionID': '736152031', 'type': 'all'}
data = urllib.urlencode(params)
mb = mechanize.Browser()
mb.addheaders = [('User-agent','Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]
mb.set_handle_robots(False)
data = mb.open(url, data = data, timeout=50).read()
jn = json.loads(data)
print (jn)

输出:
{u'signatures': [{u'signtime': u'2017-08-11T03:15:33-07:00', u'number': u'32183', u'firstname': u'Valeska', u'lastname': u'K\xf6hler', u'state': u'', u'petitionID': 736152031, u'prefix': u'', u'passportID': 859429254, u'answer': u'', u'country': u'de', u'thumbnail': u'//dingo.care2.com/avatars/avatar-31.png'}, {u'signtime': u'2017-08-11T03:15:04-07:00', u'number': u'32182', u'firstname': u'jeannie', u'lastname': u'myers', u'state': u'QL', u'petitionID': 736152031, u'prefix': u'', u'passportID': 931195678, u'answer': u'That is an unnecessary ignorant fear reaction !!\U0001f622', u'country': u'au', u'thumbnail': u'//dingo.care2.com/avatars/avatar-40.png'}, {u'signtime': u'2017-08-11T03:14:44-07:00', u'number': u'32181', u'firstname': u'IUSUT', u'lastname': u'MIHAIL', u'state': u'', u'petitionID': 736152031, u'prefix': u'', u'passportID': 625886988, u'answer': u'', u'country': u'ro', u'thumbnail': u'//dingo.care2.com/avatars/avatar-02.png'}, {u'signtime': u'2017-08-11T03:14:43-07:00', u'number': u'32180', u'firstname': u'christine', u'lastname': u'lebrun', u'state': u'', u'petitionID': 736152031, u'prefix': u'', u'passportID': 919702445, u'answer': u'', u'country': u'fr', u'thumbnail': u'//dingo.care2.com/avatars/avatar-35.png'}, {u'signtime': u'2017-08-11T03:14:37-07:00', u'number': u'32179', u'firstname': u'Margaret', u'lastname': u'Crupi', u'state': u'', u'petitionID': 736152031, u'prefix': u'', u'passportID': 352074022, u'answer': u'', u'country': u'it', u'thumbnail': u'//dingo.care2.com/avatars/avatar-48.png'}, {u'signtime': u'2017-08-11T03:14:35-07:00', u'number': u'32178', u'firstname': u'Laaj', u'lastname': u'Jainrathore', u'state': u'', u'petitionID': 736152031, u'prefix': u'', u'passportID': 869300239, u'answer': u'', u'country': u'in', u'thumbnail': u'//dingo.care2.com/avatars/avatar-08.png'}, {u'signtime': u'2017-08-11T03:14:32-07:00', u'number': u'32177', u'firstname': u'Carla', u'lastname': u'Sluiter', u'state': u'', u'petitionID': 736152031, u'prefix': u'', u'passportID': 943512161, u'answer': u'', u'country': u'nl', u'thumbnail': u'//dingo.care2.com/avatars/avatar-34.png'}, {u'signtime': u'2017-08-11T03:14:23-07:00', u'number': u'32176', u'firstname': u'Nadia', u'lastname': u'Dumont', u'state': u'', u'petitionID': 736152031, u'prefix': u'', u'passportID': 120113644, u'answer': u'', u'country': u'fr', u'thumbnail': u'//dingo.care2.com/avatars/avatar-05.png'}, {u'signtime': u'2017-08-11T03:14:16-07:00', u'number': u'32175', u'firstname': u'sandy', u'lastname': u'Paul', u'state': u'', u'petitionID': 736152031, u'prefix': u'', u'passportID': 665562190, u'answer': u'', u'country': u'zw', u'thumbnail': u'//dingo.care2.com/avatars/avatar-17.png'}, {u'signtime': u'2017-08-11T03:14:16-07:00', u'number': u'32174', u'firstname': u'Julie Lind', u'lastname': u'Bugge', u'state': u'', u'petitionID': 736152031, u'prefix': u'', u'passportID': 991829483, u'answer': u'', u'country': u'no', u'thumbnail': u'//dingo.care2.com/avatars/avatar-14.png'}, {u'signtime': u'2017-08-11T03:14:14-07:00', u'number': u'32173', u'firstname': u'Renato', u'lastname': u'Volo', u'state': u'', u'petitionID': 736152031, u'prefix': u'', u'passportID': 546399047, u'answer': u'', u'country': u'it', u'thumbnail': u'//dingo.care2.com/avatars/avatar-13.png'}, {u'signtime': u'2017-08-11T03:14:14-07:00', u'number': u'32172', u'firstname': u'Annette', u'lastname': u'Vorreiter', u'state': u'', u'petitionID': 736152031, u'prefix': u'', u'passportID': 176102442, u'answer': u'', u'country': u'de', u'thumbnail': u'//dingo.care2.com/avatars/avatar-31.png'}, {u'signtime': u'2017-08-11T03:14:08-07:00', u'number': u'32171', u'firstname': u'Anna', u'lastname': u'Novikova', u'state': u'', u'petitionID': 736152031, u'prefix': u'', u'passportID': 423305750, u'answer': u'', u'country': u'ru', u'thumbnail': u'//dingo.care2.com/avatars/avatar-34.png'}, {u'signtime': u'2017-08-11T03:13:39-07:00', u'number': u'32170', u'firstname': u'Daniele', u'lastname': u'Brutails', u'state': u'', u'petitionID': 736152031, u'prefix': u'', u'passportID': 463184194, u'answer': u'', u'country': u'fr', u'thumbnail': u'//dingo.care2.com/avatars/avatar-48.png'}, {u'signtime': u'2017-08-11T03:13:37-07:00', u'number': u'32169', u'firstname': u'Francesca', u'lastname': u'Bottura Dr.', u'state': u'', u'petitionID': 736152031, u'prefix': u'', u'passportID': 748318263, u'answer': u'', u'country': u'de', u'thumbnail': u'//dingo.care2.com/avatars/avatar-23.png'}, {u'signtime': u'2017-08-11T03:13:33-07:00', u'number': u'32168', u'firstname': u'Klod', u'lastname': u'Binette', u'state': u'ON', u'petitionID': 736152031, u'prefix': u'', u'passportID': 829164963, u'answer': u'', u'country': u'ca', u'thumbnail': u'//dingo.care2.com/avatars/avatar-53.png'}, {u'signtime': u'2017-08-11T03:13:29-07:00', u'number': u'32167', u'firstname': u'Birgit', u'lastname': u'Devinck', u'state': u'', u'petitionID': 736152031, u'prefix': u'', u'passportID': 152801006, u'answer': u'', u'country': u'be', u'thumbnail': u'//dingo.care2.com/avatars/avatar-44.png'}, {u'signtime': u'2017-08-11T03:13:35-07:00', u'number': u'32166', u'firstname': u'Elena', u'lastname': u'Kobel', u'state': u'', u'petitionID': 736152031, u'prefix': u'', u'passportID': 289697452, u'answer': u'', u'country': u'ru', u'thumbnail': u'//dingo.care2.com/avatars/avatar-26.png'}, {u'signtime': u'2017-08-11T03:13:26-07:00', u'number': u'32165', u'firstname': u'Kelly', u'lastname': u'martins', u'state': u'', u'petitionID': 736152031, u'prefix': u'', u'passportID': 178687327, u'answer': u'', u'country': u'pt', u'thumbnail': u'//dingo.care2.com/avatars/avatar-01.png'}, {u'signtime': u'2017-08-11T03:13:17-07:00', u'country': u'us', u'number': u'32164', u'petitionID': 736152031, u'state': u'WV', u'answer': u''}, {u'signtime': u'2017-08-11T03:13:07-07:00', u'number': u'32163', u'firstname': u'amy', u'lastname': u'balduccio', u'state': u'', u'petitionID': 736152031, u'prefix': u'', u'passportID': 300568205, u'answer': u'', u'country': u'it', u'thumbnail': u'//dingo.care2.com/avatars/avatar-15.png'}, {u'signtime': u'2017-08-11T03:13:04-07:00', u'number': u'32162', u'firstname': u'Tom', u'lastname': u'Trollip', u'state': u'', u'petitionID': 736152031, u'prefix': u'', u'passportID': 191801121, u'answer': u'', u'country': u'za', u'thumbnail': u'//dingo.care2.com/avatars/avatar-36.png'}, {u'signtime': u'2017-08-11T03:12:57-07:00', u'number': u'32161', u'firstname': u'Biliana', u'lastname': u'Stoimenova', u'state': u'', u'petitionID': 736152031, u'prefix': u'', u'passportID': 805908369, u'answer': u'', u'country': u'bg', u'thumbnail': u'//dingo.care2.com/avatars/avatar-57.png'}, {u'signtime': u'2017-08-11T03:12:48-07:00', u'number': u'32160', u'firstname': u'Mary Jane', u'lastname': u'Penny', u'state': u'NS', u'petitionID': 736152031, u'prefix': u'', u'passportID': 738198745, u'answer': u'', u'country': u'ca', u'thumbnail': u'//dingo.care2.com/avatars/avatar-48.png'}, {u'signtime': u'2017-08-11T03:12:30-07:00', u'number': u'32159', u'firstname': u'Rita', u'lastname': u'Mandy', u'state': u'', u'petitionID': 736152031, u'prefix': u'', u'passportID': 105176875, u'answer': u'', u'country': u'nl', u'thumbnail': u'//dingo.care2.com/avatars/avatar-38.png'}, {u'signtime': u'2017-08-11T03:12:25-07:00', u'number': u'32158', u'firstname': u'Cornelia', u'lastname': u'Cron', u'state': u'', u'petitionID': 736152031, u'prefix': u'', u'passportID': 548415909, u'answer': u'', u'country': u'ch', u'thumbnail': u'//dingo.care2.com/avatars/avatar-56.png'}, {u'signtime': u'2017-08-11T03:12:25-07:00', u'number': u'32157', u'firstname': u'Heidi Anna', u'lastname': u'SAlicites', u'state': u'', u'petitionID': 736152031, u'prefix': u'', u'passportID': 255777868, u'answer': u'JUSTICE!!!!', u'country': u'fr', u'thumbnail': u'//dingo.care2.com/avatars/avatar-48.png'}, {u'signtime': u'2017-08-11T03:12:24-07:00', u'number': u'32156', u'firstname': u'Katarzyna', u'lastname': u'Chabinka', u'state': u'', u'petitionID': 736152031, u'prefix': u'', u'passportID': 428503483, u'answer': u'', u'country': u'pl', u'thumbnail': u'//dingo.care2.com/avatars/avatar-16.png'}, {u'signtime': u'2017-08-11T03:12:16-07:00', u'number': u'32155', u'firstname': u'Anja', u'lastname': u'Muc', u'state': u'', u'petitionID': 736152031, u'prefix': u'', u'passportID': 886625416, u'answer': u'', u'country': u'si', u'thumbnail': u'//dingo.care2.com/avatars/avatar-13.png'}, {u'signtime': u'2017-08-11T03:12:11-07:00', u'number': u'32154', u'firstname': u'M', u'lastname': u'Uitendaal', u'state': u'', u'petitionID': 736152031, u'prefix': u'', u'passportID': 583056481, u'answer': u'', u'country': u'nl', u'thumbnail': u'//dingo.care2.com/avatars/avatar-42.png'}, {u'signtime': u'2017-08-11T03:12:09-07:00', u'number': u'32153', u'firstname': u'Rodrigo Alberto', u'lastname': u'Corral Prieto', u'state': u'', u'petitionID': 736152031, u'prefix': u'', u'passportID': 874484021, u'answer': u'', u'country': u'es', u'thumbnail': u'//dingo.care2.com/avatars/avatar-24.png'}, {u'signtime': u'2017-08-11T03:11:46-07:00', u'country': u'at', u'number': u'32152', u'petitionID': 736152031, u'state': u'', u'answer': u''}, {u'signtime': u'2017-08-11T03:11:45-07:00', u'number': u'32151', u'firstname': u'Elke', u'lastname': u'Keilhack', u'state': u'', u'petitionID': 736152031, u'prefix': u'', u'passportID': 587405469, u'answer': u'', u'country': u'de', u'thumbnail': u'//dingo.care2.com/avatars/avatar-40.png'}, {u'signtime': u'2017-08-11T03:11:38-07:00', u'number': u'32150', u'firstname': u'carol', u'lastname': u'montiel', u'state': u'', u'petitionID': 736152031, u'prefix': u'', u'passportID': 597892359, u'answer': u'', u'country': u'es', u'thumbnail': u'//dingo.care2.com/avatars/avatar-41.png'}, {u'signtime': u'2017-08-11T03:11:34-07:00', u'number': u'32149', u'firstname': u'myriam', u'lastname': u'monfort', u'state': u'', u'petitionID': 736152031, u'prefix': u'', u'passportID': 468649913, u'answer': u'', u'country': u'sn', u'thumbnail': u'//dingo.care2.com/avatars/avatar-45.png'}, {u'signtime': u'2017-08-11T03:11:22-07:00', u'number': u'32148', u'firstname': u'Katarzyna', u'lastname': u'Marszczewska', u'state': u'', u'petitionID': 736152031, u'prefix': u'', u'passportID': 925605596, u'answer': u'', u'country': u'pl', u'thumbnail': u'//dingo.care2.com/avatars/avatar-20.png'}, {u'signtime': u'2017-08-11T03:11:18-07:00', u'number': u'32147', u'firstname': u'Rosanna', u'lastname': u'Bub', u'state': u'NY', u'petitionID': 736152031, u'prefix': u'', u'passportID': 192955958, u'answer': u'', u'country': u'us', u'thumbnail': u'//dingo.care2.com/avatars/avatar-46.png'}, {u'signtime': u'2017-08-11T03:11:04-07:00', u'number': u'32146', u'firstname': u'Carol', u'lastname': u'Lois', u'state': u'', u'petitionID': 736152031, u'prefix': u'', u'passportID': 984811368, u'answer': u'', u'country': u'es', u'thumbnail': u'//dingo.care2.com/avatars/avatar-46.png'}, {u'signtime': u'2017-08-11T03:10:58-07:00', u'number': u'32145', u'firstname': u'heidi', u'lastname': u'coomans', u'state': u'', u'petitionID': 736152031, u'prefix': u'', u'passportID': 318995974, u'answer': u'', u'country': u'be', u'thumbnail': u'//dingo.care2.com/avatars/avatar-14.png'}, {u'signtime': u'2017-08-11T03:10:56-07:00', u'number': u'32144', u'firstname': u'BELEN', u'lastname': u'FERNANDEZ', u'state': u'', u'petitionID': 736152031, u'prefix': u'', u'passportID': 293631858, u'answer': u'', u'country': u'es', u'thumbnail': u'//dingo.care2.com/avatars/avatar-05.png'}, {u'signtime': u'2017-08-11T03:10:56-07:00', u'number': u'32143', u'firstname': u'Rosario', u'lastname': u'Sottomayor', u'state': u'', u'petitionID': 736152031, u'prefix': u'', u'passportID': 361636785, u'answer': u'', u'country': u'pt', u'thumbnail': u'//dingo.care2.com/avatars/avatar-09.png'}, {u'signtime': u'2017-08-11T03:10:42-07:00', u'number': u'32142', u'firstname': u'Aur\xe9lie', u'lastname': u'Taillade', u'state': u'', u'petitionID': 736152031, u'prefix': u'', u'passportID': 150185514, u'answer': u'', u'country': u'fr', u'thumbnail': u'//dingo.care2.com/avatars/avatar-47.png'}, {u'signtime': u'2017-08-11T03:10:36-07:00', u'number': u'32141', u'firstname': u'Linda', u'lastname': u'Boots', u'state': u'', u'petitionID': 736152031, u'prefix': u'', u'passportID': 365546914, u'answer': u'', u'country': u'ge', u'thumbnail': u'//dingo.care2.com/avatars/avatar-02.png'}, {u'signtime': u'2017-08-11T03:10:35-07:00', u'number': u'32140', u'firstname': u'M.', u'lastname': u'L.', u'state': u'', u'petitionID': 736152031, u'prefix': u'', u'passportID': 561519437, u'answer': u'', u'country': u'de', u'thumbnail': u'//dingo.care2.com/avatars/avatar-06.png'}, {u'signtime': u'2017-08-11T03:10:26-07:00', u'number': u'32139', u'firstname': u'Junghyun', u'lastname': u'Yoo', u'state': u'', u'petitionID': 736152031, u'prefix': u'', u'passportID': 183208382, u'answer': u'', u'country': u'de', u'thumbnail': u'//dingo.care2.com/avatars/avatar-43.png'}, {u'signtime': u'2017-08-11T03:10:19-07:00', u'number': u'32138', u'firstname': u'Dave', u'lastname': u'Watt', u'state': u'SC', u'petitionID': 736152031, u'prefix': u'', u'passportID': 640241450, u'answer': u'', u'country': u'gb', u'thumbnail': u'//dingo.care2.com/avatars/avatar-54.png'}, {u'signtime': u'2017-08-11T03:10:17-07:00', u'number': u'32137', u'firstname': u'Inge', u'lastname': u'Clegg', u'state': u'', u'petitionID': 736152031, u'prefix': u'', u'passportID': 235047028, u'answer': u'', u'country': u'za', u'thumbnail': u'//dingo.care2.com/avatars/avatar-42.png'}, {u'signtime': u'2017-08-11T03:10:06-07:00', u'number': u'32136', u'firstname': u'Jul', u'lastname': u'Gtsmen', u'state': u'', u'petitionID': 736152031, u'prefix': u'', u'passportID': 942199826, u'answer': u'', u'country': u'il', u'thumbnail': u'//dingo.care2.com/avatars/avatar-23.png'}, {u'signtime': u'2017-08-11T03:10:05-07:00', u'number': u'32135', u'firstname': u'Judith', u'lastname': u'Notario Calurano', u'state': u'', u'petitionID': 736152031, u'prefix': u'', u'passportID': 621092394, u'answer': u'', u'country': u'es', u'thumbnail': u'//dingo.care2.com/avatars/avatar-22.png'}, {u'signtime': u'2017-08-11T03:10:05-07:00', u'number': u'32134', u'firstname': u'Penny', u'lastname': u'Coleman', u'state': u'SW', u'petitionID': 736152031, u'prefix': u'', u'passportID': 310698412, u'answer': u'', u'country': u'gb', u'thumbnail': u'//dingo.care2.com/avatars/avatar-25.png'}, {u'signtime': u'2017-08-11T03:10:01-07:00', u'number': u'32133', u'firstname': u'tjesje', u'lastname': u'kuipers', u'state': u'', u'petitionID': 736152031, u'prefix': u'', u'passportID': 649606054, u'answer': u'', u'country': u'nl', u'thumbnail': u'//dingo.care2.com/avatars/avatar-23.png'}], u'signature_count': 32170}

您可以通过以下方式访问签名计数:
print (jn['signature_count'])

关于python - 使用 python 和 BeautifulSoup 抓取不完整的标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45631115/

相关文章:

Python 剥离 Google 快讯 URL

python - BeasutifulSoup4 中的导航

python - Argparse 需要一个参数

python - 分发具有 Julia 依赖项的独立 Python 软件

python - Pandas read_html 生成带有元组列名称的空 df

python - 如何使用 urllib2 向 Coverity Web api 发送请求?

python - 我试图理解下面的预测模型的形状值。请帮我理解值(value)和解释器的o/p是什么意思?

python - 当表格单元格采用混合格式时抓取维基百科信息框

python requests 破坏了选项标签

python - Urllib2- 抓取并显示任意语言页面,编码问题