【问题标题】:How to extract certain parts of an HTML paragraph如何提取 HTML 段落的某些部分
【发布时间】:2018-05-06 21:18:47
【问题描述】:

我是网络抓取和正则表达式的新手,在这里遇到了问题。我的一个代码给了我一个 HTML 输出,但我需要从段落中提取某个部分而不是完整的段落。我需要帮助。下面是我的代码。

import mechanize
from bs4 import BeautifulSoup
import urllib2
br = mechanize.Browser()
response = br.open("http://www.consultadni.info/index.php")
br.select_form(name="form1")
br['APE_PAT']='PATRICIO'
br['APE_MAT']='GAMARRA'
br['NOMBRES']='MARCELINA'
req=br.submit().read()
soup = BeautifulSoup(req, "lxml")
for link in soup.findAll("a"):
     sub=link.get("href")
     soup1 = BeautifulSoup(sub, "lxml")
     print soup1.find_all('p')

屏幕输出:

[<p>/</p>]
[<p>datospersonales.php?nc=PATRICIO GAMARRA MARCELINA&amp;dni1=40772568&amp;dni2=12405868&amp;id1=12a40a58a68&amp;id2=30/06/1980&amp;dni3=40631880</p>]
[<p>datospersonales.php?nc=PATRICIO GAMARRA MARCELINA&amp;dni1=40772568&amp;dni2=12405868&amp;id1=12a40a58a68&amp;id2=30/06/1980&amp;dni3=40631880</p>]
[<p>http://www.infocorpperuconsultatusdeudas.blogspot.com/2015/05/infocorp-consulta-gratis-tu-reporte-de.html?ref=dnionline</p>]

我需要什么:30/06/1980 & 40631880

【问题讨论】:

  • 尝试用urllib.parse.parse_qs 解析sub 以获取变量和值的字典。
  • ParseResult(scheme='', netloc='', path='tmp', params='', query='', fragment='') ParseResult(scheme='', netloc= '', path='tmp', params='', query='', fragment='') ParseResult(scheme='', netloc='', path='tmp', params='', query=' ', 片段='')
  • 我是正则表达式的新手,那么这个正则表达式应该是什么?

标签: python html web-scraping beautifulsoup mechanize


【解决方案1】:

对于 Python 2.7 试试这个方法:

from urlparse import parse_qs

result = set()

for link in soup.find_all("a"):
     sub = parse_qs(link.get("href"))

     if "id2" in sub:
         result.add((sub["id2"][0], sub["dni3"][0]))

print result

【讨论】:

  • 安德烈这也不起作用。我修改了我的代码,在 () 14 for link in soup.find_all("a"): 15 sub = parse_qs(link. get("href")) ---> 16 print sub["id2"][0], sub["dni3"][0] KeyError: 'id2'
  • 好的。我修改了添加检查的代码。可能有一些没有查询的href。
  • 好,我试试这个
  • 哟!这行得通,最后一个快速问题,所以输出给了我 2 个重复值(因为这也是它在浏览器中出现的方式)我如何省略重复值。示例:O/p 为:30/06/1980 40631880 30/06/1980 40631880 而我只需要:30/06/1980 40631880
  • 这行得通 :) 我希望我能对此表示赞成,作为一个新成员,它说没有显示少于 15 名声望的投票!谢谢!!!
【解决方案2】:

解析 URL 的简洁方法(Python 3):

from urllib import parse

URL = "datospersonales.php?nc=PATRICIO GAMARRA MARCELINA&dni1=40772568&dni2=12405868&id1=12a40a58a68&id2=30/06/1980&dni3=40631880"

query_parts = parse.parse_qs(parse.urlparse(URL).query)

print(query_parts["id2"][0], query_parts["dni3"][0])

【讨论】:

  • 啊,这在 python 2.7.14 中对我不起作用 :( 感谢您的帮助。一个简单的问题,URL 是 o/p 中的第二段。我们如何打印第二段而不是其他段?
  • @Sandrachuz find_all() 应该返回一个常规的 Python 列表,其项目可以以通常的方式访问。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-26
  • 1970-01-01
  • 2021-04-30
  • 2019-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多