就像标题中所述,我正在尝试抓取除<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
,所以我无法使用它,如果可以尝试的话,那会很棒上面的代码。
答案 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"})
)。
希望这会有所帮助!