python请求发布返回纯文本

时间:2019-04-27 22:56:38

标签: python web-scraping character-encoding python-requests

就像标题中所述,我正在尝试抓取除<mount> <mount-name>/listen.mp3</mount-name> <fallback-mount>/main.mp3</fallback-mount> <fallback-override>1</fallback-override> </mount> <mount> <mount-name>/main.mp3</mount-name> <fallback-mount>/primary.mp3</fallback-mount> <fallback-override>1</fallback-override> </mount> <mount> <mount-name>/primary.mp3</mount-name> <fallback-mount>/secondary.mp3</fallback-mount> <fallback-override>1</fallback-override> </mount> 之外还需要使用post的网站。

下面是代码,我们将不胜感激任何帮助

get

我可以成功到达该站点,但是我无法理解返回的结果(它既不是html / xml也不是json,只是text / plain,无论发生什么原因吗?此外,这种方法不会返回我所有的内容可以实际观察到此页面,但是使用headers = {'Accept-Encoding': 'gzip, deflate', 'Accept-Language': 'en,zh;q=0.9,zh-CN;q=0.8', 'Connection': 'keep-alive', 'Content-Length': '71', 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8', 'Cookie':'acw_tc=65c86a0915562424980896166e8d7e63f2a68a3ce0960e074dfd8883b55f5a; __utmc=105455707; __utmz=105455707.1556243245.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); ajaxkey=1F7A239ABF2F548B9A3EF4A0F6FF5FDC66906C5D06FBF3C0; __utma=105455707.894288893.1556243245.1556400728.1556404658.5; __utmt=1; __utmb=105455707.1.10.1556404658; SERVERID=8abfb74b5c7dce7c6fa0fa50eb3d63af|1556404667|1556404656', 'Host': 'www.ipe.org.cn', 'Origin': 'http://www.ipe.org.cn', 'Referer': 'http://www.ipe.org.cn/GreenSupplyChain/Communication.aspx', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36', 'X-Requested-With': 'XMLHttpRequest'} url = "http://www.ipe.org.cn/data_ashx/GetAirData.ashx" from_data = {'cmd': 'getcommunicationlist', 'pageSize': 4, 'pageIndex': 2, 'industryId': 'on', 'storyId': 0} html = requests.get(url, data=from_data, headers=headers) bsobj = BeautifulSoup(html.content,'html.parser') bsobj # just a part of all the results {isSuccess:'1',content:'%3Cul%3E%3Cli%3E%3Ctable%3E%3Ctr%3E%3Ctd%3E%3Cimg%20id%3D%223 可以(此速度很慢,因此我正在尝试寻找更好的解决方案)。

我想要的结果如果selenium)应该返回HTML标签以外的任何内容,例如“推动一家泡沫材料对废气违规记录进行整改”。 编辑

我知道在通常情况下,我可以使用find("div", {"class": "f26"})来解析结果,但是由于返回的类型只是bs,所以我无法使用它,如果可以尝试的话,那会很棒上面的代码。

2 个答案:

答案 0 :(得分:2)

这是一种非常骇人听闻的方法,但它似乎可行...

从检查数据来看,服务器似乎正在返回已转换为字符串的Python字典的等价物,例如

function(param: Param) {
    return new Promise<boolean>( (resolve, reject) => {
      this.http.post<boolean>(URLT+id, options).subscribe( (res => {
        resolve(res);
      }));
    });
  }

从诸如字符串之类的字典中提取字典的通常方法是使用ast.literal_eval,但是>>> s = str({'a': 'b'}) >>> s "{'a': 'b'}" 无法评估字符串(以ast.literal_eval失败) *

但是,字符串字典似乎只有两个键:“ isSuccess”和“ content”。仅关注“内容”的值,因此我们可以从字符串中提取该值。

ValueError: malformed node or string: <_ast.Name object at 0x7f719518c7b8>

quoted = re.sub(r'\{.*content:', '', html.text[:-1]) 看起来像这样:

quoted

它看起来像包含%编码的文本。可以使用urllib.parse.unquote进行解码:

quoted[:20]
"'%3Cul%3E%3Cli%3E%3C"

unquoted = urllib.parse.unquote(quoted) 看起来

unquoted

这看起来更好,但是看起来应该用Unicode换码的字符序列在应该有“ \”的地方有一个“%”。当后跟“ u”和四个十六进制字符时,让我们尝试用反斜杠替换“%”。

unquoted[:60]
'\'<ul><li><table><tr><td><img id="3383" title="%u54C1%u724CX"'

这几乎是正确的,但是需要删除双反斜杠。将文本编码为latin-1将保留所有字节,然后使用“ unicode-escape”编解码器进行解码将删除多余的反斜杠。

replaced = re.sub(r'(%)(u[A-Fa-f0-9]{4})', r'\\\g<2>', unquoted)  
replaced[:60]
'\'<ul><li><table><tr><td><img id="3383" title="\\u54C1\\u724CX"'

这看起来足以传递给BeautifulSoup。

markup = replaced.encode('latin-1').decode('unicode-escape')
markup[:60]
'\'<ul><li><table><tr><td><img id="3383" title="品牌X" src="http'

* 我想知道为什么 soup = bs4.BeautifulSoup(markup) soup.find("div", {"class": "con"}) <div class="con"><img src="/public/static/images/icons/g-gas.png"/> 废气<br/>● 环境违规事项:工业废气污染源;<br/>● 潜在影响:空气质量、公众健康。</div> 无法解析字符串字典。

答案 1 :(得分:0)

为了进行分析,您应该使用BeautifulSoup库,您的代码应如下所示:

from bs4 import BeautifulSoup


headers = {'Accept-Encoding': 'gzip, deflate',
           'Accept-Language': 'en,zh;q=0.9,zh-CN;q=0.8',
           'Connection': 'keep-alive',
           'Content-Length': '71',
           'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8',
           'Cookie':'acw_tc=65c86a0915562424980896166e8d7e63f2a68a3ce0960e074dfd8883b55f5a; __utmc=105455707; __utmz=105455707.1556243245.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); ajaxkey=1F7A239ABF2F548B9A3EF4A0F6FF5FDC66906C5D06FBF3C0; __utma=105455707.894288893.1556243245.1556400728.1556404658.5; __utmt=1; __utmb=105455707.1.10.1556404658; SERVERID=8abfb74b5c7dce7c6fa0fa50eb3d63af|1556404667|1556404656',
           'Host': 'www.ipe.org.cn',
           'Origin': 'http://www.ipe.org.cn',
           'Referer': 'http://www.ipe.org.cn/GreenSupplyChain/Communication.aspx',
           'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36',
           'X-Requested-With': 'XMLHttpRequest'}

url = "http://www.ipe.org.cn/data_ashx/GetAirData.ashx"
from_data = {'cmd': 'getcommunicationlist',
             'pageSize': 4,
             'pageIndex': 2,
             'industryId': 'on',
             'storyId': 0}
html = requests.get(url,
                     data=from_data,
                     headers=headers)
soup = BeautifulSoup(html.content,"lxml")
all_div = soup.find("div", {"class": "list-recent"})

(如果您都尝试查找多个div,请确保使用findAll("div", {"class": "list-recent"})而不是find("div", {"class": "list-recent"}))。

希望这会有所帮助!